贪婪和懒惰匹配模式使用小结

所谓的贪婪/懒惰匹配模式,就是指正则表达式在匹配字符串是的两种不同的匹配策略。
简单的说就是,贪婪匹配模式在正则匹配时会尽量匹配出尽可能多的字符;而懒惰匹配模式则相反,它会匹配尽可能少的字符。

举例来说,

我们要匹配以字符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字符),另一组时ab(第23个字符)。但为什么结果是aab?按照懒惰模式匹配,他应该匹配出符合条件的最短的字符(最短的字符应该是ab)。

简单的说,正则表达式有一条规则,比懒惰/贪婪规则优先级更高:最先开始的匹配拥有最高优先权

提示:

在实际开发中,涉及贪婪模式与懒惰模式的地方是很多的。在一定的情况下,使用懒惰模式可以减少回溯,提高效率。