Hỗ trợ regex nhiều dòng trong Vim


116

Tôi nhận thấy cú pháp regex tiêu chuẩn để so khớp trên nhiều dòng là sử dụng / s, như sau:

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

Ví dụ, điều này hoạt động trong Perl nhưng dường như không được hỗ trợ trong Vim. Thay vào đó, tôi phải cụ thể hơn nhiều:

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

Tôi không thể tìm thấy bất kỳ lý do nào cho lý do tại sao điều này phải như vậy, vì vậy tôi nghĩ rằng tôi có thể đã bỏ lỡ các phần liên quan trong trợ giúp vim.

Bất cứ ai có thể xác nhận hành vi này theo cách này hay cách khác?

Câu trả lời:


176

Có, công cụ //ssửa đổi của Perl không khả dụng trên Vim regexes. Xem :h perl-patternschi tiết và danh sách các điểm khác biệt khác giữa Vim và Perl regexes.

Thay vào đó, bạn có thể sử dụng \_., có nghĩa là "khớp với bất kỳ ký tự đơn nào bao gồm cả dòng mới". Nó ngắn hơn một chút so với những gì bạn có. Thấy chưa :h /\_..

/This\_.*text/

4
Tốt đẹp - cuộc sống của tôi dễ dàng hơn một chút. Tôi đang làm (. | \ N) *
ojrac

2
Dấu gạch chéo phía trước :h /\_.để làm gì? Ý tôi là, tôi biết nó hoạt động, nhưng tại sao nó :h /\_.hoạt động, và không:h \_. ?
Chỉnh sửa

2
@Eddified dấu gạch chéo (đó là chìa khóa mặc định để tìm kiếm) chỉ rõ bối cảnh \_.mà bạn có thể đọc như: cho tôi giúp đỡ cho sự biểu hiện tìm kiếm \_.
Florian

Tuy nhiên, có vẻ như tôi không thể thực hiện kết hợp lười biếng với biểu thức này, ngay cả khi tôi đã đưa nó vào trong dấu ngoặc đơn? Có cách nào để làm điều đó?
xji

2
@JIXiang Đối với trận đấu lười biếng foo bar \n foo baz \n foo, hãy thử/foo\_.\{-}foo
James M. Lay
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.