[英]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/
这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.