Regex Lazy模式不会'没有按预期工作

Regex Lazy mode doesn't work as expected

本文关键字:工作 模式 Lazy Regex      更新时间:2023-09-26

给定以下字符串:

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