正则表达式懒惰与贪婪的混淆

use*_*327 3 regex

我对正则表达式和贪婪与懒惰有点困惑.这真的很简单,感觉我错过了一些明显的东西.

我尽可能地简化了我的问题以便说清楚.考虑以下字符串和正则表达式模式.

string:
aaxxxb

pattern:
(?<=a)(.*?)(?=b)

result:
axxx

what I expected:
xxx
Run Code Online (Sandbox Code Playgroud)

这个结果是我期望使用的.*而不是.*?,我错过了什么?

显然,同样的事情,如果我使用.*?b给我aaxxxb.为什么是这样?不应该懒(比如.*?)尽可能少的字符返回?

Cas*_*yte 6

你错过了一个正则表达式引擎从左到右,逐个位置工作,并在当前位置找到匹配后立即成功的事实.

在您的示例中,模式成功的第一个位置是第二个"a".

懒惰只在右侧起作用.

如果你想获得"xxx",更好的方法是使用否定的字符类[^ab]*而不是.*?

注意:与主题不完全相关,但很有必要:DFA正则表达式引擎将尝试在交替的情况下获得最大的结果,NFA为您提供第一个成功的结果.

  • 总是很高兴看到你.正如你所说,抓住"正则表达式引擎从左到右,按位置工作"是一个常见的绊脚石...更大的混乱来源是我们在字符串上从左到右*两个*工作在模式上.当我们谈到从左到右时,我希望有一种方法可以轻松地表达这一点.BTW我知道你知道这一点,但.NET有一个从右到左的选择!:) (2认同)