这种模式:
/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/