(?:(\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。