繁体   English   中英

正则表达式懒惰模式无法正常工作

[英]Regex Lazy mode doesn't work as expected

给出以下字符串:

FFSMQWUNUPZRJMTHACFELGHDZEJWFDWVPYOZEVEJKQWHQAHOCIYWGVLPSHFESCGEUCJGYLGDWPIWIDWZZXRUFXERABQJOXZALQOCSAYBRHXQQGUDADYSORTYZQPWGMBLNAQOFODSNXSZFURUNPMZGHTA

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

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

我唯一能找到的是

CFELGHDZEJWFDWVPYOZEVEJKQWHQAHOCIYWGVLPSHFESCGEUCJGYLGDWPIWIDWZZXRUFXERABQJOXZALQOCSAYBRHXQQGUDA

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

我错过了什么?

如果您愿意,可以在这里测试一下

任何帮助表示赞赏。

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

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

x+?y

匹配时:

xxxy

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

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

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

RegEx演示

CSAYBRHXQQGUDA在您给定的输入中找到CSAYBRHXQQGUDA

(?=(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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM