Подтвердить что ты не робот

Vim: Как я исключаю целое слово из моего поиска?

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

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

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

4b9b3361

Ответ 1

Здесь строка поиска.

/abc \(defg\)\@!

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

:help \@!

Ответ 2

предшествует или следует?

Если что-то начинается с "abc", а не (немедленно), а затем "defg" , вы хотите bmdhacks".

Если все начинается с "abc", а не (сразу) предшествует "defg" , вам нужен отрицательный lookbehind:

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

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

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

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

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

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

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

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

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

Ответ 3

Здесь мы идем, это волосатый:

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

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

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

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

Ответ 4

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

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