Понимание негативного взгляда
Я пытаюсь понять, как негативные взгляды работают на простых примерах. Например, рассмотрим следующее регулярное выражение:
a(?!b)c
Я думал, что негативный взгляд соответствует позиции. Итак, в этом случае регулярное выражение соответствует любой строке, содержащей строго 3 символа и не abc
.
Но это не так, как показано в этой демонстрации. Зачем?
Ответы
Ответ 1
Lookaheads не потребляют никаких символов. Он просто проверяет, можно ли сопоставить lookahead или нет:
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
Положительный взгляд
Положительный взгляд похож на то, что он пытается сопоставить шаблон в lookahead. Если он может быть сопоставлен, то двигатель регулярных выражений будет продолжен с учетом остальной части шаблона. Если он не может, матч отбрасывается.
например.
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
Ответ 2
@Antario, я был замешан в негативном взгляде впереди/позади случая в регулярном выражении на некоторое время, и этот сайт имеет большое объяснение.
Итак, в вашем примере вы говорите, что у вас есть буквальный "a", и за ним не следует буквальный "b", а за ним следует буква "c".
Вот другой отладчик регулярных выражений, чем вы использовали, что дает более наглядный ответ, который лично я считаю полезным:)
a(?!b)c
![Regular expression visualization]()
Демоверсия Debuggex
Ответ 3
a(?!b)c
будет соответствовать только ac
, потому что единственный способ, которым вы будете иметь a
, за которым следует "not b
" (который не будет использоваться), а затем c
, - ac
.
Ответ 4
Итак, в этом случае регулярное выражение соответствует любой строке, содержащей строго 3 символа, и не является abc
Это не совсем правильно. В этом регулярном выражении говорится, что мы ищем последовательность, которая firstsymbol имеет значение a
и после нее c
, а внутри нет b
.
Например, a(?!b).
будет соответствовать либо ac
, либо af
, так как нет ограничений на последний символ через .