На простом уровне движок регулярных выражений запускается слева от строки и постепенно перемещается вправо, пытаясь сопоставить ваш паттерн (представьте, что курсор перемещается по строке).В случае обхода, при каждой остановке курсора указывается обход, и если он равен true, двигатель продолжает пытаться сопоставить.Как только двигатель сможет соответствовать вашему шаблону, он вернет соответствие.
В позиции 0 вашей строки (т. Е. До B
в Batman
) подтверждение выполнено успешно, поскольку Bat
отсутствует до текущей позиции - таким образом, \w+
может соответствоватьвсе слово Batman
(помните, что регулярные выражения по своей природе жадные - т.е. будут соответствовать как можно больше).
См. эту страницу для получения дополнительной информации о движкеВнутренние органы.
Чтобы достичь того, что вы хотели, вместо этого вы можете использовать что-то вроде:
\b(?!Bat)\w+
В этом шаблоне движок будет соответствовать границе слова (\b
) 1 , за которым следуют один или несколько символов слова, с утверждением, что символы слова не начинаются с Bat
. lookahead используется вместо lookbehind , потому что использование здесь lookbehind будет иметь ту же проблему, что и ваш исходный шаблон;он будет выглядеть перед позицией, следующей непосредственно за границей слова, и поскольку уже определено, что позиция перед курсором является границей слова, отрицательный взгляд за ним всегда будет успешным.
1 Обратите внимание, что границы слов соответствуют границе между \w
и \W
(т. Е. Между [A-Za-z0-9_]
и любым другим символом; он также соответствует ^
и $
якорям ).Если ваши границы должны быть более сложными, вам понадобится другой способ привязки вашего шаблона.