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