Почему символ ^ требуется в регулярном выражении ^ (?!. *? Spam) для фильтрации строк? - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь отфильтровать строки, которые не содержат слова «спам».Я использую регулярное выражение из здесь !

Но я не могу понять, зачем мне нужен символ ^ в начале выражения.Я знаю, что это подписывает начало регулярного выражения, но я не понимаю, почему это не работает без ^ в моем случае?

UPD.Все ответы ниже очень полезны.Теперь это совершенно ясно.Спасибо!

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Регулярное выражение (?!.*?spam) соответствует позиции в строке, которая не , за которой следует что-то, совпадающее с .*?spam.

Каждая строка имеет такую ​​позицию, потому что, если ничего другого,за самым концом строки, конечно же, не следует ничего, совпадающего с .*?spam.

Таким образом, каждая строка содержит совпадение с регулярным выражением (?!.*?spam).

Якорь ^ в ^(?!.*?spam) ограничивает регулярное выражение, так что оно соответствует только тем строкам, в которых за началом строки не следует ничего, совпадающего с .*?spam, то есть со строками, которые вообще не содержат spam (или где-нибудь в первой строке, по крайней мере, в зависимости от того, соответствует ли . символом новой строки).

0 голосов
/ 11 февраля 2019

Lookahead - это утверждение нулевой ширины (то есть оно обеспечивает позицию в вашей строке).В вашем случае это негативный взгляд, который следит за тем, чтобы «не ноль больше символов, за которыми следовал спам».Это верно для пары позиций в вашей строке, см. демонстрацию на regex101.com без привязки.

С якорем процесс сопоставления начинается в самом начале, поэтому анализируется вся строка, см. измененное демо в регулярном выражении regex101.com.

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