^ вызвать некоторые проблемы в регулярных выражениях
Я пытаюсь сопоставить подстроку с регулярным выражением, но ^ меняет логику, как я и не ожидал. Регулярное выражение...
^(?!My Words).*$
отклоняет предложение, которое начинается с My Words
, В этом случае отрицательный прогноз проверяет все слово. Однако, если я уроню ^
затем
(?!My Words).*$
регулярное выражение просто возвращает y Words lskjdf
в предложении, содержащем My Words lskjdf
, Почему в этом случае негативная перспектива не рассматривается в целом? Почему выбирает только M
для матча? Как ^
а также (?1
работает коллективно?
2 ответа
^(?!My Words).*$
^(?!
означает искать начало строки или строки с многострочным флагом, за которым не следует...
Вот почему любое предложение, начинающееся с "Моих слов", не совпадает при использовании ^
якорь.
Причина по которой y Words
сопоставляется при удалении ^
Якорь в том, что теперь вы просто ищете любую точку в строке, за которой не следует My Words
, которая соответствует позиции после M
,
Давайте посмотрим на строку My Words
и как (?!My Words).*$
применяется к нему.
Имейте в виду, что ^
это начало строки, даже если вы не указали ее в своем регулярном выражении, двигатель регулярного выражения все равно запустится в этой позиции. Я немного упросту, как это работает.
Первый шаг двигателя регулярного выражения:
^My Words
|
Regex engine starts here, and looks if the current position onwards
matches (?!My Words), which it does not.
Второй шаг:
^My Words
|
Regex engine evaluates the 'M', and finds that from this position
onwards also fails to match (?!My Words)
Третий шаг:
^My Words
|
Standing at 'y', it finds that the lookahead now does not match 'My Words'.
This allows the rest of the pattern '.*$' to be applied, which matches
from 'y' till end of string.
Это потому что с ^
Вы делаете обязательным совпадение с начала строки.
Без ^
это будет соответствовать где-нибудь между строкой и поэтому будет соответствовать y Words lskjdf