почему этот негативный взгляд не работает? - PullRequest
1 голос
/ 31 мая 2019

Оба из следующих производят строку gotcha. почему?

perl -e 'print "gotcha\n" if "corecaptured" =~ /(?!corecaptured)/;'

perl -e 'print "gotcha\n" if "corecaptured" =~ /(?=corecaptured)/;'

Я ожидаю, что первый ничего не напечатает, так как отрицательный прогноз должен дать ложный результат, но я явно что-то упускаю.

когда я вставляю регулярное выражение в отладчик, я получаю неожиданные результаты: https://regex101.com/r/eM4tF1/4

1 Ответ

3 голосов
/ 31 мая 2019

Ваши регулярные выражения не привязаны.Первое условие действительно говорит: «есть ли в строке "corecaptured" позиция, за которой не следует текст corecaptured?».

Ответ на этот вопрос - «да», поскольку по смещению 1 следующая строка"orecaptured", который не начинается с c.Вот почему соответствие регулярному выражению возвращает true.

Вы, вероятно, имели в виду /^(?!corecaptured)/, который проверяет, не начинается ли целевая строка с corecaptured.


Что касается вашей ссылки на regex101,который содержит совершенно другое регулярное выражение: a(?!b)c эквивалентно ac, потому что (?!b)c означает «соответствует c в позиции, где следующий символ не является b» (или, другими словами, «соответствует * 1019»* это также не b ").

Если вы измените его на то, что в вашем коде , вы увидите, что результатом будет одно успешное совпадение (длиной 0)) по смещению 1:

corecaptured
 ^
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...