Ma thuật regex của Vim có tương thích với các lớp regex nổi tiếng không?


15

Các cú pháp biểu thức chính quy của nhiều công cụ Unix thường là Biểu thức chính quy mở rộng và cơ bản được mã hóa theo POSIX (tương ứng BRE và ERE) và, trong một số triển khai hiện đại, kiểu Perl (PCRE là cách triển khai này).

Có sự tương ứng một-một giữa các cấp độ ma thuật của Vim và các lớp được xác định bên ngoài, nhưng nổi tiếng như vậy không? Nó trông giống như \mBRE và \vlà ERE, ngoại trừ POSIX không bao gồm các giao diện.

Nếu một sự tương ứng như vậy tồn tại, nó được xác định ở đâu đó? pattern.txtchỉ có một đề cập đến POSIX.

Hay chúng ta phải gắn bó với "phép thuật" để mô tả các biểu thức chính quy của Vim?


3
Khá chắc chắn \vbao gồm các <>ranh giới từ, mà AFAIK là duy nhất cho Vim. Vì vậy, không, chỉ mô tả chúng là "Vim regex." (Không đăng dưới dạng câu trả lời vì tôi không tích cực)
Doorknob 27/2/2015

@Doorknob, tôi nghĩ rằng bạn có thể tìm thấy cuộc thảo luận về câu trả lời dưới dạng bình luận thú vị này. Vì nhận xét của bạn có ba lượt phản hồi và không có bình luận nào phản hồi cho bạn biết điều đó không chính xác, có lẽ nó đúng (tôi không chắc chắn), nhưng đề xuất chỉnh sửa et. al. không thể cải thiện độ chính xác của nó. Như một câu trả lời được đăng, nó có thể được chỉnh sửa để cải thiện độ chính xác, nâng cấp, hạ cấp, trả lời, v.v.
Wildcard

Câu trả lời:


21

Tóm lại, không. Regex của Vim là một hương vị độc đáo, và không có lựa chọn nào để khiến nó hoạt động giống như một hương vị khác.

Tôi nghĩ rằng đây là một điều tốt.

ma thuật

Các 'magic'tùy chọn không làm thay đổi hương vị của regex mà Vim sử dụng. Nó chỉ đơn giản là đảo ngược hành vi của nhiều \nguyên tử.

Ví dụ, theo mặc định, +là một ký +tự theo nghĩa đen , \+có nghĩa là "một hoặc nhiều nguyên tử trước". Ngược lại, *có nghĩa là "không hoặc nhiều hơn các nguyên tử trước", trong khi đó \*là một nghĩa đen *. Nhiều người thấy điều này khá khó hiểu. Sử dụng \vtrong mô hình của bạn làm cho nó phù hợp hơn một chút. :help 'magic'đưa ra một bản tóm tắt tốt:

after:    \v       \m       \M       \V         matches ~
                'magic' 'nomagic'
          $        $        $        \$         matches end-of-line
          .        .        \.       \.         matches any character
          *        *        \*       \*         any number of the previous atom
          ()       \(\)     \(\)     \(\)       grouping into an atom
          |        \|       \|       \|         separating alternatives
          \a       \a       \a       \a         alphabetic character
          \\       \\       \\       \\         literal backslash
          \.       \.       .        .          literal dot
          \{       {        {        {          literal '{'
          a        a        a        a          literal 'a'

Cá nhân, tôi nghĩ rằng hành vi mặc định là tốt cho các tệp mã, trong đó không có gì lạ khi tìm kiếm những thứ như foo(, sử dụng nghĩa đen (.

Hương vị regex của riêng Vim

Tôi đã chứng kiến ​​nhiều người mong muốn Vim hỗ trợ PCRE. Cá nhân, tôi muốn các công cụ khác hỗ trợ hương vị regex của Vim. Nó có một số khả năng không thể hoặc quá cồng kềnh để đạt được trong PCRE.

Không thể trong PCRE

Nhìn chung là một tính năng phổ biến trong đó bạn có thể khẳng định rằng một mẫu có hoặc không khớp trước hoặc sau mẫu bạn đang cố khớp. Ví dụ: mẫu PCRE q(?!u)(hoặc mẫu biểu thức Vim regex qu\@!) khớp với mẫu qkhông theo sau bởi a u. (Điều này đúng hơn q[^u], đòi hỏi phải có một số ký tự sau q.)

Cái nhìn tiêu cực có chiều dài thay đổi

PCRE, và nhiều hương vị khác, có một hạn chế là mẫu hình nhìn tiêu cực phải có độ dài cố định. Điều đó có nghĩa là một mẫu như (?<![a-z]{3})foo, có nghĩa là "chuỗi foo không đứng trước chính xác 3 chữ cái thường") là tốt, nhưng (?<![a-z]+)foo(có nghĩa là "chuỗi fookhông đứng trước bất kỳ số lượng chữ cái thường" nào thì không.

Hạn chế này không tồn tại trong Vim. Trong Vim, một mô hình như \([a-z]\+\)\@<!foo, trong khi có thể hơi xấu xí để xem xét, là hoàn toàn hợp lệ.

Dễ dàng hơn trong Vim regex

Một số thứ đẹp hơn rất nhiều trong hương vị regex của Vim.

Bắt đầu và kết thúc neo trận đấu

Đáng chú ý nhất, theo tôi, là \zs\zeneo. Điều này cho phép bạn chỉ định bắt đầu và kết thúc trận đấu. Ví dụ, foo(\zs.*\ze)chỉ khớp với những gì giữa ()trong một hàm gọi như thế nào foo(...). Điều này có thể được thực hiện trong PCRE, nhưng nó yêu cầu sử dụng giao diện, điều này hơi tẻ nhạt:(?<=foo\().*(?=\))

Kết hợp tiền tố

Một điều thú vị khác mà Vim có thể làm là khớp với bất kỳ tiền tố nào (bao gồm tiền tố trống) của một chuỗi ký tự cụ thể. Ví dụ, để phù hợp trên f, fo, foo, hay food, mô hình f\%[ood]có thể được sử dụng. Trong PCRE, một mô hình như vậy sẽ như thế nào f(o(od?)?)?. (Hãy tưởng tượng rằng cho một chuỗi dài hơn!)

Khớp các vị trí con trỏ, đường và cột

Regex của Vim có một số neo cho các vị trí khớp trong bộ đệm.


Tôi nghĩ rằng nó đáng để nắm lấy hương vị regex của Vim. Nó rất phù hợp để sử dụng trong trình soạn thảo văn bản được sử dụng chủ yếu cho lập trình và nó khá mạnh mẽ.

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.