Regex 理解消极前瞻
我试图理解负面表情如何在简单的例子中起作用。例如,考虑下面的正则表达式:Regex 理解消极前瞻,regex,regex-lookarounds,Regex,Regex Lookarounds,我试图理解负面表情如何在简单的例子中起作用。例如,考虑下面的正则表达式: a(?!b)c 我认为负前瞻符合一个位置。因此,在这种情况下,正则表达式匹配任何严格包含3个字符且不是abc的字符串 但这不是真的,从中可以看出。为什么? lookahead不使用任何字符。它只是检查前瞻是否可以匹配: a(?!b)c 因此,在这里匹配a之后,它只检查它后面是否紧跟b,但不使用not字符(即c),后面紧跟c a(?!b)c如何匹配ac 积极前瞻 正向前瞻的相似之处在于它尝试匹配前瞻中的模式。如果可以匹
a(?!b)c
我认为负前瞻符合一个位置。因此,在这种情况下,正则表达式匹配任何严格包含3个字符且不是abc
的字符串
但这不是真的,从中可以看出。为什么? lookahead不使用任何字符。它只是检查前瞻是否可以匹配:
a(?!b)c
因此,在这里匹配a
之后,它只检查它后面是否紧跟b
,但不使用not
字符(即c
),后面紧跟c
a(?!b)c
如何匹配ac
积极前瞻 正向前瞻的相似之处在于它尝试匹配前瞻中的模式。如果可以匹配,则正则表达式引擎继续匹配模式的其余部分。如果不能,则放弃匹配 例如
abc(?=123)\d+
匹配abc123
abc123
|
a
abc123
|
b
abc123
c
abc123 #Tries to match 123; since is successful, the pointer remains at c
|
(?=123)
abc123 # Match is success. Further matching of patterns (if any) would proceed from this position
|
abc123
|
\d
abc123
|
\d
abc123 #Reaches the end of input. The pattern is matched completely. Returns a successfull match by the regex engine
|
\d
因此,在这种情况下,正则表达式匹配任何严格包含3个字符且不是abc的字符串
这是不对的。这个正则表达式表示我们正在搜索一个序列,其中firstsymbol是a
,之后是c
,而在该序列中没有b
例如,
a(?b)
将匹配ac
或af
,因为通过
a(?b)c
对最后一个符号没有任何限制,a(?b)c
将只匹配ac
,因为唯一的方法是a
后跟“not code>b”(不会被使用)然后是c
,是ac@Antario,我对regex中的消极前瞻/落后案例感到困惑了一段时间,站点有很好的解释
在你的例子中,你要说的是,你有一个文字“a”,后面不是文字“b”,后面是文字“c”
这里有一个与您使用的不同的regex调试器,它提供了一个更直观的答案,我个人认为这很有帮助:)
a(?!b)c
也许这会有帮助:@RocketHazmat是的,这很有帮助,但这是谷歌的第一个结果:)我读过这篇文章为了补充这个问题,一个常见的误解是,你可以用否定的lookaheads来代替多词否定,甚至尝试其他方法,所以你会看到像这样的坏正则表达式:[a-Za-z]+(?![a-Za-z])
,[^BLOW]fish
,(?!BLOW)fish
重要的是要注意,例如,+(?!b)。+
如果(?!b)
失败,第一个+
将尝试匹配较短的字符串,然后再次执行检查。因此,+(?!b)。+//code>将bbbabb
与第一个+
匹配bbb
,第二个匹配abb
。()与其说发生了回溯,不如说指针永远不会移动。当模式失败时,常规匹配会发生回溯。您不能记下正向前瞻吗?除非它检查(?=pattern)
中的模式是否匹配,否则这与负前瞻相同。@St.Antario Yup。它只是检查模式是否匹配。如果可以匹配,将继续使用rest模式,否则将放弃。看看@St.Antario,我也在positive look ahead上添加了一个编辑。希望它能帮助您:)字符串不存在以a
开头或以c
结尾的条件。仅包含ac
abc123
|
a
abc123
|
b
abc123
c
abc123 #Tries to match 123; since is successful, the pointer remains at c
|
(?=123)
abc123 # Match is success. Further matching of patterns (if any) would proceed from this position
|
abc123
|
\d
abc123
|
\d
abc123 #Reaches the end of input. The pattern is matched completely. Returns a successfull match by the regex engine
|
\d