我对正则表达式和贪婪与懒惰有点困惑.这真的很简单,感觉我错过了一些明显的东西.
我尽可能地简化了我的问题以便说清楚.考虑以下字符串和正则表达式模式.
string:
aaxxxb
pattern:
(?<=a)(.*?)(?=b)
result:
axxx
what I expected:
xxx
Run Code Online (Sandbox Code Playgroud)
这个结果是我期望使用的.*而不是.*?,我错过了什么?
显然,同样的事情,如果我使用.*?b给我aaxxxb.为什么是这样?不应该懒(比如.*?)尽可能少的字符返回?
你错过了一个正则表达式引擎从左到右,逐个位置工作,并在当前位置找到匹配后立即成功的事实.
在您的示例中,模式成功的第一个位置是第二个"a".
懒惰只在右侧起作用.
如果你想获得"xxx",更好的方法是使用否定的字符类[^ab]*而不是.*?
注意:与主题不完全相关,但很有必要:DFA正则表达式引擎将尝试在交替的情况下获得最大的结果,NFA为您提供第一个成功的结果.
| 归档时间: |
|
| 查看次数: |
537 次 |
| 最近记录: |