嘎嘎,其实俺对零宽断言一直似懂非懂,趁这机会赶紧研究一番。一直知道这个匹配的是个位置,但是前后顺序并不太清楚,所以这两句俺也不知道有嘛区别。
研究了一番后,俺再来看这个例子就明白多了。
第一个,俺再看时,被雷了一下。难道这不是个错误的正则咩,冏,但是PHP是不会报错滴,只是输出鸟一个0。
- $str = 'm123';
- echo preg_match('/^(?=\d)m$/',$str);
在群里跟shanji,小鱼儿讨论之后,都认同了,这个正则是木法匹配滴。
因为(?=\d)匹配的是后面是数字的这样一个位置,但是偏偏它的后面是个m,所以此句匹配不能。
再来看第二个,这句的错误就在于(?=\d)后面的那个$,它的后面要的是数字,而不是结束符。
- $str = 'm123';
- echo preg_match('/^m(?=\d)$/',$str); //如果是/^m(?=\d)/,那么就能匹配m123中滴m鸟
上面的是零宽先行断言(肯定顺序环视),再说个零宽后行断言(肯定逆序环视)的例子
- $str = '123m';
- echo preg_match('/(?<=\d)m$/',$str);
- //匹配123m中的m,前面不能有^,是木有/^(?<=\d)/这样一个位置的
举个实际应用零宽断言的例子吧。。
- $pop = 'The US population is 3298444215';
- echo $pop;
- $pop = 'The US population is 3298444215';
- $pop = preg_replace('/(?<=\d)(?=(\d\d\d)+(?!\d))/',',',$pop);
- echo $pop;
- //The US population is 3,298,444,215
其中的正则匹配的是左边有1个数字,右边为3的倍数个数字且后面不为数字的位置,最后用”,”替换。
嘎嘎,其实开始木明白,感觉shanji童鞋的帮助。
俺的第一篇原创技术文章,就此诞生,在此俺感谢CCAV,感谢PPC,感谢yes,感谢yes的水友们。。。还有《精通正则表达式》
零宽断言 不错.值得学习
[回复]