Поддержка многострочных регулярных выражений в Vim


117

Я заметил, что стандартный синтаксис регулярного выражения для сопоставления нескольких строк заключается в использовании / s, например:

This is\nsome text
/This.*text/s

Это работает, например, в Perl, но, похоже, не поддерживается в Vim. Вместо этого я должен быть более конкретным:

/This[^\r\n]*[\r\n]*text/

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

Может ли кто-нибудь так или иначе подтвердить такое поведение?

Ответы:


177

Да, //sмодификатор Perl недоступен в регулярных выражениях Vim. См. :h perl-patternsПодробности и список других различий между регулярными выражениями Vim и Perl.

Вместо этого вы можете использовать \_., что означает «соответствовать любому одиночному символу, включая новую строку». Это немного короче того, что у вас есть. Смотрите :h /\_..

/This\_.*text/

4
Хорошо - моя жизнь стала немного проще. Я делал (. | \ N) *
ojrac

2
Что делает косая черта в :h /\_.? То есть, я знаю, что это работает, но почему :h /\_.работает, а нет :h \_.?
Изменено

2
@Eddified косая черта (которая является ключом по умолчанию для поиска) определяет контекст, в \_.котором вы можете читать, например: дайте мне помощь по поисковому выражению \_.
Флориан

Однако кажется, что я не могу выполнить ленивое сопоставление с этим выражением, даже если я включил его в круглые скобки? Есть ли способ это сделать?
xji 08

2
@JIXiang Для ленивого матча foo bar \n foo baz \n fooпопробуйте/foo\_.\{-}foo
Джеймс М. Лэй
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.