Подтвердить что ты не робот

Понимание негативного взгляда

Я пытаюсь понять, как негативные взгляды работают на простых примерах. Например, рассмотрим следующее регулярное выражение:

a(?!b)c

Я думал, что негативный взгляд соответствует позиции. Итак, в этом случае регулярное выражение соответствует любой строке, содержащей строго 3 символа и не abc.

Но это не так, как показано в этой демонстрации. Зачем?

4b9b3361

Ответ 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, так как нет ограничений на последний символ через .