怎样用一条PCRE正则表达式提取IP为76.16.17.81~76.16.17.84之外的所有IP

正则表达式是没有求余集操作符的,你得自己展开,所以大概会类似于
【怎样用一条PCRE正则表达式提取IP为76.16.17.81~76.16.17.84之外的所有IP】 (\\d{0,2}|7)(\\.\\d+){3}|
76\\.(\\d{0,2}|1\\d{0,1}|16\\d)(\\.\\d+){2}|
76\\.16\\....|
76\\.16\\,.17\\....
后面太麻烦了自己写

■网友
我是PHP程序员,最近黑PHP的比较多,我写出来的话,不会被打吧。......^(?!76\\.16\\.17\\.8)(25|2|??)\\.(25|2|??)\\.(25|2|??)\\.(25|2|??)$PCRE里有个环视(Lookaround),来判断你不要的那个IP段的第一个字符的位置,剩下的,就交给合法IP段的判断表达式了。php preg系列函数测试通过$arr = array( \u0026#39;1\u0026#39;, //不是合法IP格式 \u0026#39;2.2\u0026#39;, //不是合法IP格式 \u0026#39;3.3.3\u0026#39;, //不是合法IP格式 \u0026#39;1.1.1.1\u0026#39;, //没错,就是你 \u0026#39;76.16.17.81\u0026#39;, //合法IP格式,但楼主讨厌它 \u0026#39;76.16.17.82\u0026#39;, //合法IP格式,但楼主讨厌它 \u0026#39;76.16.17.83\u0026#39;, //合法IP格式,但楼主讨厌它 \u0026#39;76.16.17.84\u0026#39;, //合法IP格式,但楼主讨厌它 \u0026#39;76.16.17.85\u0026#39;, //没错,就是你 \u0026#39;100.100.100.100\u0026#39;, //没错,就是你 \u0026#39;256.256.256.256\u0026#39; //不是合法IP格式);foreach ($arr as $v){ if (preg_match(\u0026#39;/^(?!76\\.16\\.17\\.8)(25|2|??)\\.(25|2|??)\\.(25|2|??)\\.(25|2|??)$/\u0026#39;, $v)) { echo $v,"\"; } }怎样用一条PCRE正则表达式提取IP为76.16.17.81~76.16.17.84之外的所有IP


■网友
现有的正则表达式语法不支持 交 和 差,不过正则语言在 并交差补 操作下都是封闭的,我写了一个DFA正则引擎,支持并交差补,详情可参见: http://nfabo.cn
■网友
把IP转化成int貌似更简单些,便宜楼主,碰巧有现成代码import socketdef ip2num(addr): # parse the address string into integer quads quads = map(ord, socket.inet_aton(addr)) # spread the quads out return reduce(lambda x,y: x * 0x100 + y, quads)def num2ip(num): return "%d.%d.%d.%d" % (num/0x1000000, num%0x1000000/0x10000, num%0x10000/0x100, num%0x100)#num2ip(ip2num("76.16.17.81"))upper_bound = ip2num("76.16.17.84")lower_bound = ip2num("76.16.17.81")for i in xrange(ip2num("255.255.255.255")): if i \u0026gt; upper_bound or i \u0026lt; lower_bound: print num2ip(i)
■网友
由轮子哥启发:.+|\\d.+|.{3}.+|.{4}.+|....{10}中间不换行,中间有省略,就是逐位取否,然后 或运算76.16.17.81~76.16.17.84
■网友
ip转int,然后比大小,正则不合适处理数据值大小这个事情
■网友
反正你的范围小,先把所有IP弄出来,判断一下是不是在你的范围内


    推荐阅读