^ вызвать некоторые проблемы в регулярных выражениях

Я пытаюсь сопоставить подстроку с регулярным выражением, но ^ меняет логику, как я и не ожидал. Регулярное выражение...

      ^(?!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

Другие вопросы по тегам