Regex 使反向的非贪婪正则表达式与正向的行为相同

Regex 使反向的非贪婪正则表达式与正向的行为相同,regex,pcre,regex-greedy,non-greedy,Regex,Pcre,Regex Greedy,Non Greedy,这种模式: /a+?b+?/ 针对以下字符串: aaaaaabbbbbb 匹配项: aaaaaab 我们看到,非贪婪的行为在向后/向左方向(全部接受)和向前/向右方向(仅接受一个)上有所不同 有没有一种方法可以使一开始的非贪婪匹配所有a,从而尽可能少地匹配?因此,它的行为方式与at相同,在末尾的b部分?它们的行为方式是相同的!惰性量词(在本例中是惰性的+)告诉正则表达式引擎 从第一个可能的位置开始 然后尽可能少地匹配字符(如果是+,则至少匹配一个字符) 但尽可能多的匹配,以允许整体匹配发

这种模式:

/a+?b+?/
针对以下字符串:

aaaaaabbbbbb
匹配项:

aaaaaab
我们看到,非贪婪的行为在向后/向左方向(全部接受)和向前/向右方向(仅接受一个)上有所不同

有没有一种方法可以使一开始的非贪婪匹配所有
a
,从而尽可能少地匹配?因此,它的行为方式与at相同,在末尾的
b
部分?

它们的行为方式是相同的!惰性量词(在本例中是惰性的
+
)告诉正则表达式引擎

  • 从第一个可能的位置开始
  • 然后尽可能少地匹配字符(如果是
    +
    ,则至少匹配一个字符)
  • 但尽可能多的匹配,以允许整体匹配发生
正则表达式不匹配“leftwards”或“backwards”,正如您所暗示的

你到底想达到什么目的?我想这并不是一个简单的例子——修复起来很简单(只需创建regex
ab
,这可能不是您想要的)。

简单的答案 正则表达式通常从左到右匹配,除非设置从右到左的标志(很少有风格支持)。在这两种情况下,它们都不会从中间开始,然后在两个方向上进行操作,即使使用了LoopEnter。

懒惰量词是如何工作的? 停下来问问——为什么懒惰量词首先存在?它要解决什么问题

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

例如,考虑以下输入:

\u abc\u END\u def\u END
这种模式:

/a+?b+?/
(\w+END)
目的是匹配
\u abc\u
,然后匹配
END
。问题是
END
\w+
的一个子集。使用标准的“贪婪”规则,
\w+
尽可能匹配。因此,它没有匹配
\u abc\u
,而是匹配了
\u abc\u END\u def

此场景的解决方案是使用惰性修饰符
更改量词(
+
)的行为方式。通过将表达式更改为
\w+?
,正则表达式引擎将被迫只匹配满足表达式所需的数量,而不再匹配。当
\w+?
匹配
\u abc\u
END
匹配其文本字符串时,表达式满足要求

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

回到你的问题上来 在您的示例中,
b
不是
a
的子集,因此不需要惰性量词。如果您希望匹配一个或多个a,但尽可能少,以及一个或多个b,但尽可能少,那么您只需使用:

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

[ab]b
例如:

\wb
这两个选项都将匹配:

ab
例如:

const input=“aaabbb”

console.log(/ab/.exec(input)[0])
如果您不必执行前面提到的从右向左匹配,那么您可以简单地反转字符串,反转正则表达式,然后在末尾反转结果

工作如下:

Start with aaaaaabbbbbb
Reverse to bbbbbbaaaaaa
Reverse /a+?b+?/ to /b+?a+?/
The resulting Match is bbbbbba
Reverse the resulting match to get abbbbbb

在贪婪非捕获组之前:

/(?:a)*a+?b+?/

我想知道如何使用
a
在左侧获得尽可能少的匹配的一般方法。当然,这只是一个例子。你能举个有意义的例子吗?然后可能会向您展示一个有意义的解决方案。@flori:您需要以某种方式拒绝匹配
aaaaaab
aaaab
aab
,以匹配
ab
,如果这是您想要的。在这种情况下,我会使用
indexOf(“ab”)
@flori-“你应该根据你面临的实际问题提出实际的、可回答的问题”-@Cyborgx37哇,谢谢。事实上,它是基于一个真实的问题,但我不能解释整个背景。不过这次讨论已经帮了我很多忙了!