Підтримка багаторядкових регулярних виразів у Vim


116

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

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

Наприклад, це працює в Perl, але, схоже, він не підтримується у Vim. Натомість я повинен бути набагато конкретнішим:

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

Я не можу знайти жодної причини, чому це повинно бути, тому я думаю, що, мабуть, просто пропустив відповідні біти у довідці vim.

Чи може хтось так чи інакше підтвердити цю поведінку?

Відповіді:


176

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

Натомість ви можете використовувати \_., що означає "відповідати будь-якому одному символу, включаючи новий рядок". Це трохи коротше, ніж у вас. Див :h /\_..

/This\_.*text/

4
Приємно - моє життя просто трохи полегшилося. Я робив (. | \ N) *
ojrac

2
Що робить нахил вперед :h /\_.? Я маю на увазі, я знаю, що це працює, але чому це :h /\_.працює, а ні :h \_.?
Відредаговано

2
@ Присвоєний косою рисою переду (яка є типовою клавішею для пошуку) визначає контекст, про \_.який можна прочитати: надайте мені допомогу в пошуковому виразі \_.
Флоріан

Однак, здається, я не можу виконати ледачу відповідність із цим виразом, навіть якщо я включив його в дужки? Чи можна це зробити?
xji

2
@JIXiang Для ледачого матчу foo bar \n foo baz \n fooспробуйте/foo\_.\{-}foo
James M. Lay
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.