理解正向和负向前瞻

问题描述 投票:0回答:5

我试图了解负向前瞻如何在简单的示例中发挥作用。例如,考虑以下正则表达式:

a(?!b)c

我认为负向前瞻与位置匹配。因此,在这种情况下,正则表达式会匹配任何严格包含 3 个字符且不是

abc
的字符串。

但事实并非如此,如此演示所示。为什么?

regex regex-lookarounds
5个回答
65
投票

前瞻不消耗任何字符。它只是检查前瞻是否可以匹配:

a(?!b)c

因此,在匹配

a
之后,它只是检查是否后面跟着
b
,但不消耗那个
not
字符(即
c
)并且后面跟着
c

a(?!b)c
如何匹配
ac

ac
|
a

ac
 |
(?!b) #checks but does not consume. Pointer remains at c

ac
 |
 c

正向前瞻

正向先行的相似之处在于它尝试匹配先行中的模式。如果可以匹配,则正则表达式引擎将继续匹配模式的其余部分。如果不能,则放弃匹配。

例如

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

9
投票

@Antario,有一段时间我对正则表达式中的负面前瞻/后瞻案例感到困惑,这个网站有一个很好的解释。

因此,在您的示例中,您所说的是您有一个文字“a”,并且后面没有文字“b”,而是后面跟着文字“c”。

这是一个与您使用的不同的正则表达式调试器,它提供了更直观的答案,我个人觉得很有帮助:)

a(?!b)c

Regular expression visualization

Debuggex 演示


4
投票

a(?!b)c
将仅匹配
ac
,因为你拥有
a
后跟“not
b
”(不会被消耗)然后
c
的唯一方法是
ac


3
投票

因此,在这种情况下,正则表达式会匹配任何严格包含 3 个字符且不是 abc 的字符串

这不太正确。这个正则表达式表明我们正在搜索一个序列,第一个符号是

a
,之后是
c
,并且里面没有
b

例如,

a(?!b).
将匹配
ac
af
,因为通过
.

对最后一个符号没有限制

0
投票

请帮忙,如果我理解正确的话,所以先行“(?=...)”之后的模式用于检查先行内的内容。在这种情况下“\d+”?

因此模式“abc(?=123)\w+”将失败“abc123”,这是正确的吗?

附注- 我认为先行 (\d+) 之后的模式是在匹配先行之后使用的模式。我希望这是有道理的,如果有任何澄清,我们将不胜感激。

© www.soinside.com 2019 - 2024. All rights reserved.