Vim: Как мне найти слово, за которым не следует другое слово? - PullRequest
33 голосов
/ 19 сентября 2008

Довольно простой вопрос, я пытаюсь написать регулярное выражение в Vim, чтобы оно соответствовало любой фразе, начинающейся с "abc ", за которой следует что-то кроме "defg".

Я использовал "[^defg]", чтобы сопоставить любой отдельный символ, кроме d, e, f или g.

Моим первым инстинктом было попробовать /abc [^\(defg\)] или /abc [^\<defg\>], но ни одна из этих работ не работает.

Ответы [ 4 ]

45 голосов
/ 19 сентября 2008

Вот строка поиска.

/abc \(defg\)\@!

Концепция, которую вы ищете, называется негативным прогнозным утверждением. Попробуйте это в vim для получения дополнительной информации:

:help \@!
15 голосов
/ 19 сентября 2008

предшествует или сопровождается?

Если что-то начинается с 'abc', за которым (сразу) не следует 'defg', вам нужно решение bmdhacks .

Если это что-то, начинающееся с 'abc', которому (сразу) не предшествует 'defg', вам нужен отрицательный взгляд сзади:

/\%(defg\)\@<!abc /

Это будет соответствовать любому вхождению 'abc', если оно не является частью 'defgabc'. Подробнее см. :help \@<!.

Если вы хотите сопоставить 'abc', если оно не является частью 'defg. * Abc', просто добавьте .*:

/\%(defg.*\)\@<!abc /

Соответствие 'abc' только в строках, где defg не встречается, похоже:

/\%(defg.*\)\@<!abc \%(.*defg\)\@!/

Хотя, если вы просто делаете это для замены, вы можете сделать это проще, комбинируя :v// и :s//

:%v/defg/s/abc /<whatever>/g

Это заменит '' на 'abc' во всех строках, которые не содержат 'defg'. Подробнее см. :help :v.

0 голосов
/ 19 сентября 2008

/ abc \ [^ d] [^ e] [^ f] [^ g]

Это довольно громоздко для больших слов, но работает как шарм.

0 голосов
/ 19 сентября 2008

Вот так, это волосатое:

/\%(\%(.\{-}\)\@<=XXXXXX\zs\)*

(заменить XXXXXX поисковым словом). Это будет искать все, что не содержит XXXXXX. Я полагаю, если вы сделали:

/abc \%(\%(.\{-}\)\@<=defg\zs\)*

Это может работать так, как вы хотите. Надеюсь, это немного поможет!

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