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
部分?它们的行为方式是相同的!惰性量词(在本例中是惰性的+
)告诉正则表达式引擎
- 从第一个可能的位置开始
- 然后尽可能少地匹配字符(如果是
,则至少匹配一个字符)+
- 但尽可能多的匹配,以允许整体匹配发生李>
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哇,谢谢。事实上,它是基于一个真实的问题,但我不能解释整个背景。不过这次讨论已经帮了我很多忙了!