Поддержка многострочных регулярных выражений в 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
Джеймс М. Лэй