一个正则表达式的例子

时间:2021-11-22 05:57:31

/* from: http://topic.csdn.net/u/20090712/17/d40e7153-d6d1-4a65-b20e-5ad6f92533a3.html */

 

需求:

 

通过.net的正则
http://www.aa.bb.com
htp://aa.bb.com
aa.bb.com

上面3个都得到 aa

并对语句稍微讲解一下。谢谢。
(? <=http://)(/w+) 这个是我写的。不知道怎么加上或者匹配www
还有? <= 这个什么意思查不到。

 

解决:

 

(?i) 匹配模式,表示忽略大小写,在.NET中等价于在后面加RegexOptions.IgnoreCase参数

(? <=^|http://(?:www/.)?) 肯定逆序环视,语法(? <=Exp),最终匹配到的只是一个位置,相当于在所在位置的左侧附加了一个条件,表示所在位置左侧必须能够匹配Exp
用在这里就表示左侧必须是字符串开始位置^,或者以http://(?:www/.)?开头,其中www.可有可无

(?!www/.) 否定顺序环视,语法(?!Exp),同上,匹配的只是一个位置,相当于在所在位置的右侧附加一个条件,表示所在位置右侧必须不能匹配Exp
用在这里是因为前面的www.是可有可无的,如果不加这个条件限定,那么最后一个例子
http://www.bb.com
将会匹配到www
在正则表达式尝试匹配到http://后的位置时,条件(? <=^|http://(?:www/.)?)中www.是可有可无的,所以也是满足的,这样后面的/b/w+就会匹配到www.,所以要加(?!www/.)这样一个条件,使这个位置的右侧不能是www.

/b/w+ /b单词边界,/w相当于[a-zA-Z0-9_]
/b限定取到的内容是开始位置,或:,或.与.之间完整的内容,而不是部分子串
还是最后的那个例了
http://www.bb.com
前面(? <=^|http://(?:www/.)?)(?!www/.)的条件限定,使得http://w以前的位置都不符合条件,在第一个w后的位置是满足以上条件的,如果这里不用/b限制,则/w+就可以匹配到ww,这个结果显然是错误的
域名的通用规则是a-zA-Z0-9_组成,其实还有一个“-”,/w在.NET中如果没有加RegexOptions.ECMAScript参数,那么还可以匹配一些本地字符集,如中文,全角数字等,所以用在这里并不是很合适,可以把表达式中的/w替换为[a-zA-Z0-9_-]

(?!/./w+$) 这个条件主要是用来限定右侧不能只有一个.com之类的域我,也就是要排除www.bb.com这种域名

(?=(?:/./w+)+) 这个条件主要是用来限定右侧要符合多个./w+这样的规则,如果能保证传过来的参数符合域名规则,这个条件可以去掉

关于环视,可以参考一下我的博客,目前只写了几篇,后续会陆续增加
正则基础之——环视

 

lxcnn (过客) 的正则确实厉害,学习地址:http://blog.csdn.net/lxcnn