关闭

一个正则表达式问题

161人阅读 评论(0) 收藏 举报
分类:

(?:(\w+\.){0,1})(\b(?!www\b)\w+)\.\b(?!(com|org|gov|net|cn)\b)\w+.\w+
一个网友问的问题,稍微有点复杂。
主要其实就是?: 和?!


?:是一个group construct,组构造。
参与匹配是肯定的,但是不会参与组计数。
也就是也许后续你可能会用\1\2来表示某个group时(?:)中的这一块将无法被引用到。同时也看到这个组的官方术语是non-capturing group。很多代码在进行匹配成功后,是能通过\$1, \$2在代码逻辑中被引用的,所以你引用的序号自然就需要把non-capturing group排除掉。比如:

if (#host ~* "(?:(\w+.){0,1})(\b(?!www\b)\w+).\b(?!(com|org|gov|net|cn)\b)\w+.\w+" ) {
set #subdomain "/$2"
}


其实(?!)的含义也是group,只是含义刚好相反,不能是某个字串。
单个字符有取反[^abc]
但是(?!abc)有点特殊的是,一般都需要前面有东西匹配到。
比如looks(?!good)就不能匹配”looksgood”中的”looks”。
如果只是写(?!good) 不会匹配到任何字符串。
同样不允许匹配的字串可以有多个:
iam(?!looks|good)就不能匹配到”iamlooksgood”中的iam。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    文章分类