向后方向做一个非贪婪的RegEx,就像向前方向一样

flo*_*ori 7 regex pcre non-greedy regex-greedy

这种模式:

/a+?b+?/
Run Code Online (Sandbox Code Playgroud)

对于以下字符串:

aaaaaabbbbbb
Run Code Online (Sandbox Code Playgroud)

火柴:

aaaaaab
Run Code Online (Sandbox Code Playgroud)

我们看到非贪婪在向后/向左方向(全部采用)和向前/向右方向(仅采用一个)方面表现不同.

有没有办法让开头的非贪婪,匹配所有a,以尽可能少的匹配?这样它的行为方式与最后的b部分一样吗?

JDB*_*JDB 8

简短的回答

正则表达式通常从左到右匹配,除非您设置从右到左标志(很少有风格支持)。在任何一种情况下,即使您使用后视,它们也不会从中间开始,然后在两个方向上进行计算。

惰性量词如何工作?

停下来问一问:为什么惰性量词首先存在?它是为了解决什么问题?

正常(贪婪)量词的工作原理是找到文本的匹配模式,然后重复匹配字符序列,直到它们无法匹配为止。通常需要这种行为,但是当您有一个非常通用的模式后跟一个非常特定的模式(其中特定模式是通用模式的子集)时,就会遇到问题。

例如,考虑以下输入:

_abc_END_def_END
Run Code Online (Sandbox Code Playgroud)

还有这个模式:

(\w+END)
Run Code Online (Sandbox Code Playgroud)

目的是匹配_abc_然后END。问题是END是 的子集\w+。使用标准的“贪婪”规则,\w+尽可能多地匹配。所以与其说是匹配,不如说_abc_是匹配_abc_END_def

+这种情况的解决方案是使用惰性修饰符更改量词 () 的行为方式?。通过将表达式更改为\w+?,正则表达式引擎将被迫仅匹配满足表达式所需的数量,而不再匹配。\w+?当匹配_abc_END匹配其文字字符串时,表达式就被满足。

惰性量词的目的不是匹配“最小”数量的字符 - 它是为了给第二个模式(第一个模式的子集)一个匹配的机会。

回到你的问题

在您的示例中,b不是 的子集a,因此不需要惰性量词。如果你想匹配一个或多个 a,但尽可能少,和一个或多个 b,但尽可能少,那么你只需使用:

ab
Run Code Online (Sandbox Code Playgroud)

或者,如果您a是某个超级组的替身,其中可能包括 b:

[ab]b
Run Code Online (Sandbox Code Playgroud)

例如:

\wb
Run Code Online (Sandbox Code Playgroud)

两者都匹配:

ab
Run Code Online (Sandbox Code Playgroud)

例子:

const input = "aaabbb"

console.log(/ab/.exec(input)[0])
Run Code Online (Sandbox Code Playgroud)


Tim*_*ker -1

他们的行为确实一样!惰性量词(在本例中为lazy +)告诉正则表达式引擎

  • 从第一个可能的位置开始,
  • 然后匹配尽可能少的字符(在 a 的情况下至少匹配一个 +
  • 但匹配尽可能多的数量以允许整体匹配发生。

正如您所暗示的那样,正则表达式与“向左”或“向后”不匹配。

您究竟想要实现什么目标?我想这不是这个简单的例子 - 修复起来很简单(只需创建 regex ab,这可能不是您正在寻找的)。