贪婪和懒惰匹配模式使用小结
所谓的贪婪/懒惰匹配模式,就是指正则表达式在匹配字符串是的两种不同的匹配策略。
简单的说就是,贪婪匹配模式在正则匹配时会尽量匹配出尽可能多的字符;而懒惰匹配模式则相反,它会匹配尽可能少的字符。
举例来说,
我们要匹配以字符a
开始,以b
结束的字符串:假如我们要搜索的字符串是aabab
,那么分别按照贪婪和懒惰两种模式来匹配,将会得到以下结果:
aabab
(贪婪模式)
aab
(懒惰模式)(为什么不是ab
?)
正则表达式的这两种匹配模式的实现
- 贪婪
a.*b
一般当一个正则表达式能够匹配出多种结果时,默认将会匹配出尽可能多的字符串。
- 懒惰
a.*?b
只要表达式中的限定符后面加上一个问号。例如,(.*?
),则会匹配出符合条件的最短的字符。
懒惰模式的匹配原理
简单的来说,就是在匹配喝不匹配都可以的情况下,优先不匹配,记录备选状态,并将匹配控制权交给正则表达式的下一个匹配字符。当后面的匹配失败时,回溯,进行匹配。
常用的懒惰限定符
懒惰限定符代码/语法 | 描述 |
---|---|
*? |
重复任意次,但尽可能少重复 |
+? |
重复1次或多次,但尽可能少重复 |
?? |
重复0次或1次,但尽可能少重复 |
{n,m}? |
重复n到m次,但尽可能少重复 |
{n,}? |
重复n次以上,但尽可能少重复 |
示例中,采用a.*?b
表达式进行匹配时,匹配的结果为什么不是ab
如果我们只考虑.*?
这个表达式,aabab
字符串中将会匹配出两组字符,一组是aab
(13字符),另一组时3个字符)。但为什么结果是ab
(第2aab
?按照懒惰模式匹配,他应该匹配出符合条件的最短的字符(最短的字符应该是ab
)。
简单的说,正则表达式有一条规则,比懒惰/贪婪规则优先级更高:最先开始的匹配拥有最高优先权。
提示:
在实际开发中,涉及贪婪模式与懒惰模式的地方是很多的。在一定的情况下,使用懒惰模式可以减少回溯,提高效率。