regex - 在向后方向制作一个非贪婪的 RegEx,使其行为与向前方向相同

标签 regex pcre regex-greedy non-greedy

这种模式:

/a+?b+?/

针对以下字符串:
aaaaaabbbbbb

火柴:
aaaaaab

我们看到非贪婪在向后/向左方向(全部)和向前/向右方向(只需要一个)的行为不同。

有没有办法在开始时使非贪婪,匹配所有 a , 匹配越少越好吗?因此它的行为方式与 b 相同最后部分?

最佳答案

简短的回答
除非您设置从右到左的标志(很少有风格支持),否则正则表达式通常从左到右匹配。在任何一种情况下,它们都不会从中间开始,然后在两个方向上工作,即使您使用后视。
惰性量词是如何工作的?
停下来问问 - 为什么惰性量词首先存在是有帮助的?它想解决什么问题?
正常(贪婪)量词的工作原理是找到匹配的文本模式,然后重复匹配一系列字符,直到它们不再匹配为止。这种行为通常是需要的,但是当您有一个非常通用的模式,然后是一个非常具体的模式,其中特定模式是通用模式的子集时,就会遇到问题。
例如,考虑以下输入:

_abc_END_def_END
这个模式:
(\w+END)
目的是匹配 _abc_然后 END .问题是END\w+ 的子集.使用标准的“贪婪”规则,\w+尽可能匹配。所以,而不是匹配 _abc_ , 匹配 _abc_END_def .
这种情况的解决方案是使用惰性修饰符 + 更改量词 ( ? ) 的行为方式。 .通过将表达式更改为 \w+? ,正则表达式引擎被迫只匹配满足表达式所需的数量,仅此而已。当\w+?时满足表达式匹配 _abc_END匹配其文字字符串。
惰性量词的目的不是匹配“最小”数量的字符——它是关于给第二个模式,第一个的子集,一个匹配的机会。
回到你的问题
在您的示例中,b不是 a 的子集,所以不需要惰性量词。如果你想匹配一个或多个 a,但尽可能少,一个或多个 b,但尽可能少,那么你只需使用:
ab
或者,如果您的 a是某些超集的替代品,其中可能包括 b:
[ab]b
例如:
\wb
两者都匹配:
ab
例子:

const input = "aaabbb"

console.log(/ab/.exec(input)[0])

关于regex - 在向后方向制作一个非贪婪的 RegEx,使其行为与向前方向相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15191291/

相关文章:

java - 使用java正则表达式解析json数据

regex - 贪心正则匹配

linux - ** 无法 --enable-pcregrep-libz 因为找不到 zlib.h

c - PCRE 的 PCRE_PARTIAL 的 Perl 等价物是什么?

regex - 最小可能的匹配/非贪婪正则表达式搜索

regex - 正则表达式贪婪匹配没有按预期工作

Java 1.7。如何在正则表达式中并排替换两个字符?

Javascript正则表达式以逗号分割行

匹配 PowerShell 代码中的 "here strings"的正则表达式

c - C 中的正则表达式自定义替换函数