msgbartop
better late than never
msgbarbottom

May 04 零宽断言 环视结构

嘎嘎,其实俺对零宽断言一直似懂非懂,趁这机会赶紧研究一番。一直知道这个匹配的是个位置,但是前后顺序并不太清楚,所以这两句俺也不知道有嘛区别。

研究了一番后,俺再来看这个例子就明白多了。

第一个,俺再看时,被雷了一下。难道这不是个错误的正则咩,冏,但是PHP是不会报错滴,只是输出鸟一个0。

  1. $str = 'm123';  
  2. echo preg_match('/^(?=\d)m$/',$str); 

在群里跟shanji,小鱼儿讨论之后,都认同了,这个正则是木法匹配滴。

因为(?=\d)匹配的是后面是数字的这样一个位置,但是偏偏它的后面是个m,所以此句匹配不能。

再来看第二个,这句的错误就在于(?=\d)后面的那个$,它的后面要的是数字,而不是结束符。

  1. $str = 'm123';  
  2. echo preg_match('/^m(?=\d)$/',$str); //如果是/^m(?=\d)/,那么就能匹配m123中滴m鸟 

上面的是零宽先行断言(肯定顺序环视),再说个零宽后行断言(肯定逆序环视)的例子

  1. $str = '123m';   
  2. echo preg_match('/(?<=\d)m$/',$str); 
  3. //匹配123m中的m,前面不能有^,是木有/^(?<=\d)/这样一个位置的

举个实际应用零宽断言的例子吧。。

  1. $pop = 'The US population is 3298444215';  
  2. echo $pop
  1. $pop = 'The US population is 3298444215';  
  2. $pop = preg_replace('/(?<=\d)(?=(\d\d\d)+(?!\d))/',',',$pop);  
  3. echo $pop;  
  4. //The US population is 3,298,444,215 

其中的正则匹配的是左边有1个数字,右边为3的倍数个数字且后面不为数字的位置,最后用”,”替换。

嘎嘎,其实开始木明白,感觉shanji童鞋的帮助。

俺的第一篇原创技术文章,就此诞生,在此俺感谢CCAV,感谢PPC,感谢yes,感谢yes的水友们。。。还有《精通正则表达式》



Reader's Comments

  1. |

    零宽断言 不错.值得学习

    [回复]



Leave a Comment




*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word