给定以下字符串:
FFSMQWUNUPZRJMTHACFELGHDZEJWFDWVPYOZEVEJKQWHQAHOCIYWGVLPSHFESCGEUCJGYLGDWPIWIDWZZXRUFXERABQJOXZALQOCSAYBRHXQQGUDADYSORTYZQPWGMBLNAQOFODSNXSZFURUNPMZGHTA
我正在尝试将包含CABDA
的每个子字符串与以下正则表达式进行匹配:
C.*?A.*?B.*?D.*?A
我唯一能找到的就是
CFELGHDZEJWFDWVPYOZEVEJKQWHQAHOCIYWGVLPSHFESCGEUCJGYLGDWPIWIDWZZXRUFXERABQJOXZALQOCSAYBRHXQQGUDA
这本身并没有错,但我应该找到CSAYBRHXQQGUDA
我错过了什么?
如果您想要,可以在此处测试
感谢您的帮助。
惰性量词并不意味着它会尝试匹配尽可能小的子字符串。这只是意味着它将尝试匹配尽可能少的字符,并向更多的字符回溯,而不是匹配尽可能多的字符,然后向更少的字符回溯。
查找位置保持不变-从左到右的第一个位置。例如:
x+?y
匹配时:
xxxy
将仍然匹配xxxy
,而不仅仅是xy
,因为它能够从第一个x
开始并向更多的x
回溯。
您可以使用这个基于否定类的正则表达式:
/C[^C]*?A[^A]*?B[^B]*?D[^D]*?A/
RegEx演示
这会在给定的输入中找到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