В этой регулярке, которая соответствует строкам без слова foo внутри
^((?!foo).)*$
Что означает (?!foo)
? Как может быть позитивный просмотр вперёд без всяких символов до скобок?
Это называется "отрицательное заглядывание"
В оригинале звучит так
Starting at the current position in the expression, ensures that the given pattern will not match. Does not consume characters.
То есть, проверяет, что от текущей позиции нет нужных символов.
fo111 - подходит.
foo111 - уже не подходит.
afoo11 - также не подходит.
читать эту регулярку нужно так "для любого символа в строке не должно быть перед ним foo".
^(?!foo).$
, а ^((?!foo).)*$
, которое может быть развернуто, например, в ^((?!foo).)((?!foo).)((?!foo).)((?!foo).)$
. В итоге и получается - после каждого сработанного символа должно выполняться условие: дальше в строке нет foo