В Vim есть ли способ поиска строк, которые соответствуют словам abc
, но также не содержат xyz
позже на линии? Таким образом, следующие строки будут соответствовать:Есть ли способ сделать негативный просмотр в regex vim?
The abc is the best
The first three letters are abc
и следующий не будет соответствовать:
The abc is the best but xyz is cheaper
The first three letters are abc and the last are xyz
Я знаю о синтаксисе, как следующее:
/abc\(xyz\)\@!
но только избегает согласования abcxyz
и нет, если между ними есть что-то среднее, например abc-xyz
. Использование
/abc.*\(xyz\)\@!
также не работает, потому что есть много позиций, в конце линии, где xyz
не соответствует.
(следует отметить, что в командной строке я бы сделать что-то вроде grep abc <infile | grep -v xyz
, но я хотел бы сделать выше в интерактивном режиме в Vim.)
Это эквивалентно 'аЬс (?!. * Хуг)' в Perl-подобных системах. – nhahtdh
И это работает, потому что простой взгляд запускает еще один полномасштабный поиск из текущей позиции для шаблона и использует результат, чтобы решить, продолжать или нет (в зависимости от того, является ли прогноз вперед положительным или отрицательным). – nhahtdh
также см. ': Help perl-patterns'. Для 'pattern2', которому не предшествует' pattern1', это отрицательный look-behind, ищите '\ (pattern1 \) \ @ hochl