贪婪与懒惰

前面介绍*和+时,是匹配尽可能多的字符,称为贪婪匹配。但有时候需要匹配尽可能少的字符,称为懒惰匹配,方法是在贪婪匹配的后面添加一个问号。

常见的懒惰匹配格式如表3-5中所示。

表3-5 懒惰匹配

懒惰匹配格式 说 明
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复

下面给定原始字符串,分别使用贪婪匹配和懒惰匹配比较匹配结果。

code.matlab
>> a=' 123  abc53  59wt ';
>> m=regexp(a,'\s.+\s','match')
m =
  1×1 cell 数组
    {' 123  abc53  59wt '}

正则表达式'\s.+\s'中没有?,此为贪婪匹配,在两个空白符之间匹配尽可能多的字符,所以匹配结果是整个字符串。

code.matlab
>> m=regexp(a,'\s.+?\s','match')
m =
  1×3 cell 数组
    {' 123 '}    {' abc53 '}    {' 59wt '}

正则表达式'\s.+?\s'中+后面有?,此为懒惰匹配,在两个空白符之间匹配尽可能少的字符,所以匹配结果是空格间隔的三个子字符串。