史上最简明易懂的正则表达式教程07

By heiry on 2019-05-03 [ in 技术 ]

1.  数量限定符

数量限定符用来指定其紧邻的前表达式的出现次数,数量限定符主要有如下:

以上表格是多数书籍或网上教程对限定符的释义。其中最容易令人产生疑惑的“重复”二字,初学者往往理解为相同内容出现次数,个人认为这个词用得很不好。

对于正则表达式 \d{3},等同于\d\d\d,但用“重复”来强调,容易让人理解为相同结果重复三次,类似于(\d)\1\1的效果。

举例来说,\d{3},匹配123、673、222,但(\d)\1\1只能匹配这三个字符串中的222。而很多初学者往往理解“重复”为后者。

所以,有必要强调,限定符的重复次数是指表达式重复而不是结果重复。

值得注意的是,上下限限定符可以有{n}、{n,m}、{n,}等形式,但是不存在{,m}这种形式,这是一种错误的写法。另外,上下限量词与逗号之间不能有空格,如\d{3, 6}是错误的写法,将无法实现目标匹配:

 

2.贪婪模式与懒惰模式

“{m,n}”、“{m,}”、“?”、“*”和“+” 为贪婪模式的限定词,也叫做匹配优先量词。被匹配优先量词修饰的子表达式使用的就是贪婪模式,如“(Exp)+”。

在匹配优先量词后加上“?”,即变成属于非贪婪模式的量词,也叫做忽略优先量词,包括:

“{m,n}?”、“{m,}?”、“??”、“*?”  与 “+?”

贪婪模式总是试图尽可能多地匹配目标字符串,如以下HTML代码:

abc<p>第一段</p><p>第二段</p><p>第三段</p>def

我们用正则<p>.*</p> 去匹配

这是一种贪婪模式的匹配得到的匹配结果为:

 

贪婪模式下它会选定尽可能多的内容,如果 失败则回退一个字符,然后再次尝试回退的过程就叫做回溯,它会每次回退一个字符,直到找到匹配的内容或者没有字符可以回退。用通俗一点的话来说,在拿不准是否要匹配的情况下,优先尝试匹配,并记下这个状态,以备将来“后悔”(也就是回溯)。

我们把正则更改为<p>.*?</p> ,匹配结果如下:

可以看到,在懒惰模式下,它会尽可能少地重复限定量,只要匹配到一个就返回了结果。

我们再更改下正则:<p>.*?</p>def,再看匹配结果:

可以看到,在“整个表达式匹配成功”的前提下,非贪婪模式才真正的影响着子表达式的匹配行为,如果整个表达式匹配失败,非贪婪模式无法影响子表达式的匹配行为。

 >>



© 2009-2024 MOSANG.NET DESIGNED BY HEIRY