В Vim, как я могу сделать регулярное соответствие включительно? - PullRequest
0 голосов
/ 05 мая 2011

В vim, если я пытаюсь сопоставить выражение между строками, начиная с данной строки и заканчивая другой - включая вторую строку - как мне это сделать?

Например, при попытке сопоставления:

output = double('output').as_null_object
game = Game.new(output)

Я пытался использовать /output\_.\{-}output), но в результат поиска не включается последний «результат»). Если я затем использую c/output\_.\{-}output), чтобы изменить результат поиска, у меня останется висячий вывод).

Еще один более простой пример - попытка найти «январь» в тексте, включая кавычки.

Я новичок в vim и регулярных выражениях, так что простите, если этот вопрос кажется тривиальным. Я немного погуглил и не смог найти ответ.

ps бонусных баллов, если вы можете назвать этот фрагмент!

Ответы [ 3 ]

1 голос
/ 05 мая 2011

Учитывая документ, содержащий

STUFF

output = double('output').as_null_object
game = Game.new(output)

OTHER STUFF

output = double('output').as_null_object
game = Game.new(output)

CLOSING STUFF

Когда я делаю :%s/output\_.\{-}output)/<START>\0<MIDDLE>\0<END>/, я получаю документ, содержащий

STUFF

<START>output = double('output').as_null_object
game = Game.new(output)<MIDDLE>output = double('output').as_null_object
game = Game.new(output)<END>

OTHER STUFF

<START>output = double('output').as_null_object
game = Game.new(output)<MIDDLE>output = double('output').as_null_object
game = Game.new(output)<END>

CLOSING STUFF

Однако, если вместо этого я наведу курсор на первый output, тогда сделайте c/output\_.\{-}output), Я нахожусь в режиме вставки со всем, пока output) не удален.

Причина этого в том, что c/ удаляет все до следующего совпадения , но, как вы подозреваете, не удаляет следующее совпадение. c/ использует регулярное выражение в качестве начального местоположения, а не продолжительности.

В этом случае следующим совпадением будет output)...OTHER STUFF...output=...output).

1 голос
/ 05 мая 2011

Ваша проблема, вероятно, в том, что движение /regex по умолчанию приводит вас к началу матча, в то время как вы хотите, чтобы оно привело вас к концу. Решение добавляет /e после regex: попробуйте c/output.\{-}output)/e<CR>, см. :h search-offset для получения дополнительной информации. Или вы можете использовать \zs, чтобы переместить начало матча в другое место: c/output.\{-}output)\zs<CR>: это более полезно, если вы хотите найти совпадение где-то посередине.

0 голосов
/ 05 мая 2011

Используйте _s в разрыве между словами.Итак, / фразу1_sphrase2

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