Регулярное выражение не возвращается, когда совпадение не удается? - PullRequest
0 голосов
/ 30 апреля 2020

В regex101 : Когда я использую регулярное выражение /.*(?!~D)/ в строке Abc~D

Я думаю, что совпадение не будет выполнено в символе 'c'

и вернуть результат сопоставления будет 'Ab'

Но на самом деле фактическим результатом сопоставления будет Abc~D, кажется, что сопоставление будет продолжено после сбоя в 'c'.

1 Ответ

1 голос
/ 30 апреля 2020

Эта часть шаблона .* будет сначала соответствовать до конца строки. Тогда он будет утверждать, что справа не ~D, что верно, потому что он находится в конце строки, поэтому он будет соответствовать всей строке.

Например, вы можете начать с начала строка ^ и повтор совпадения всех символов, за которыми не следует ~D

^(?:.(?!~D))*
  • ^ начало строки
  • (?: группа без захвата
    • .(?!~D) Подберите любой символ, кроме новой строки, и подтвердите, что прямо справа не является ~D
  • )* Закройте группу и повторите 0 или более раз

См. Демонстрационную версию Regex

Если вы хотите учесть границы пробелов вместо ^ и сопоставить, например, только непробельные символы:

(?<!\S)(?:\S(?!~D))*

Regex demo

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