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 \v
trong 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 q
khô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 foo
khô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
và \ze
neo. Đ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 (
và )
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.
\%23c
khớp với cột 23
\%<23c
trận đấu trước cột 23
\%>23c
khớp sau cột 23
\%16l
phù hợp với dòng 16
- Tương tự như cột, có các neo cho trước hoặc sau một số dòng
\%#
khớp với vị trí con trỏ
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ẽ.
\v
bao 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)