首页 > 代码库 > 正则表达式三种类型的量词

正则表达式三种类型的量词

在正则表达式中,有三种不同类型额量词,分别是 贪婪的,惰性的和支配性的。这三种不同的量词处理字符串的策略,有所不同。适当的利用不同的策略,可以取得四两拨千斤的效果。在实际运用过程中,一定要分清楚他们之间的区别和联系。

贪婪量词先看整个字符串是否匹配。如果没有发现匹配,它去掉该字符串的最后一个字符,并再次尝试。如果还是没有发现匹配,那么再次去掉最后后一个字符,这个过程会一直重复直到发现一个匹配或者字符串不剩任何字符。 值得注意的是,这是正则表达式的默认行为。

惰性量词先看字符串中的第一个字母是否匹配。如果单独着一个字符还不够,就读入下一个字符,组成两个字符的字符串。如果还是没有发现匹配,惰性量词会继续从字符串中添加字符直到发现匹配或这个字符串都检查过也没有发现匹配。惰性量词和贪婪量词的工作方式是刚好相反的。

支配量词 只尝试匹配整个字符串,如果整个字符串不能产生匹配,不做进一步尝试。 如果单从定义上理解正则表达式,是晦涩难懂不说,还特别让人没信心继续深入的学习。结合自己的学习经历和前几天在SegmentFault 上看到的一篇文章,特总结一下。

贪婪 惰性 支配 描述
?? ?+ 零次或一次出现
* *? *+ 零次或多次出现
+ +? ++ 一次或一次出现
{m} {m,n} {m,} 恰好n次出现
{m}? {m,n}? {m,}? 恰好n次出现
{m}+ {m,n}+ {m,}+ 恰好n次出现

 

假设有一个名为sString的字符串, sString = "abbbaabbbaaabbb1234"

  • 对于贪婪量词:

reg1 = /.*bbb/;,因为是贪婪模式,顾名思义,它会匹配所有满足要求的字符串中最长的一个,也就是"abbbaabbbaaabbb"

  • 对于惰性量词:

reg2 = /.*?bbb/;,与贪婪模式刚好相反,它会匹配所有满足字符串中最短的一个。也就是"abbb"

  • 对于支配量词:

reg3 = /.*+bbb/;,他所作的工作最简单,就是看这整个字符串是否匹配。可知,原字符串与之不匹配。

对于以上三种情况,用JavaScript实现时,发现对于支配量词,浏览器均报错,不支持。


图1 浏览器报错

注释掉之后,结果如下图:


图2 运行结果

刚开始准备测试的时候,用的是神奇grep,结果发现不起作用,三个表达式的结果都一样,很郁闷


图3 grep不支持其余两种模式

PS:如果有朋友知道为什么浏览器不支持支配表达式,请告诉我一下,谢谢咯~