正则表达式懒惰模式无法按预期工作

时间:2015-12-20 15:42:17

标签: javascript regex

给出以下字符串:

FFSMQWUNUPZRJMTHACFELGHDZEJWFDWVPYOZEVEJKQWHQAHOCIYWGVLPSHFESCGEUCJGYLGDWPIWIDWZZXRUFXERABQJOXZALQOCSAYBRHXQQGUDADYSORTYZQPWGMBLNAQOFODSNXSZFURUNPMZGHTA

我正在尝试将包含CABDA的每个子字符串与以下正则表达式匹配:

C.*?A.*?B.*?D.*?A

我唯一能找到的是

CFELGHDZEJWFDWVPYOZEVEJKQWHQAHOCIYWGVLPSHFESCGEUCJGYLGDWPIWIDWZZXRUFXERABQJOXZALQOCSAYBRHXQQGUDA

这本身并没有错 - 但我应该找到CSAYBRHXQQGUDA

我错过了什么?

如果您愿意,可以对其进行测试here

感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

惰性量词并不意味着它会尝试匹配可能的最小子串。它只是意味着它会尽可能地匹配尽可能少的角色并向更多角色回溯,而不是匹配尽可能多的角色并向更低的方向回溯。

找到位置保持不变 - 第一个从左到右。例如:

x+?y
匹配时

xxxy

仍然会与xxxy匹配,而不仅仅是xy,因为它可以从第一个x开始,然后回溯到更多x个。

答案 1 :(得分:1)

您可以使用此基于正则表达式的否定类:

/C[^C]*?A[^A]*?B[^B]*?D[^D]*?A/

RegEx Demo

在您的给定输入中找到CSAYBRHXQQGUDA

答案 2 :(得分:0)

(?=(C.*?A.*?B.*?D.*?A))

将您的表达式放在lookahead中以获取所有匹配。请参阅演示

https://regex101.com/r/fM9lY3/46

如果您只想找到最短的,可以使用

C(?:(?!C|A|B|D).)*A(?:(?!C|A|B|D).)*B(?:(?!C|A|B|D).)*D(?:(?!C|A|B|D).)*A