2

В этой регулярке, которая соответствует строкам без слова foo внутри

^((?!foo).)*$

Что означает (?!foo) ? Как может быть позитивный просмотр вперёд без всяких символов до скобок?

1 ответ 1

3

Это называется "отрицательное заглядывание"

В оригинале звучит так

Starting at the current position in the expression, ensures that the given pattern will not match. Does not consume characters.

То есть, проверяет, что от текущей позиции нет нужных символов.

fo111 - подходит.
foo111 - уже не подходит.
afoo11 - также не подходит.

читать эту регулярку нужно так "для любого символа в строке не должно быть перед ним foo".

3
  • Не понимаю. (?!expression) - заглядывание вперёд. (?<!expression) - заглядывание назад. В регулярке используется заглядывание вперед, но при этом она работает как заглядывание назад, то смотрит, чтобы до любого символа не было foo.
    – hotshot
    5 мар 2015 в 13:33
  • @hotshot, а вы разверните исходное выражение. У вас же не ^(?!foo).$, а ^((?!foo).)*$, которое может быть развернуто, например, в ^((?!foo).)((?!foo).)((?!foo).)((?!foo).)$. В итоге и получается - после каждого сработанного символа должно выполняться условие: дальше в строке нет foo
    – BOPOH
    5 мар 2015 в 14:19
  • @ВОРОН, спасибо, очень доходчиво.
    – hotshot
    6 мар 2015 в 7:06

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.