Có cách nào để chuyển đổi một Vex regex theo nghĩa đen sang các chế độ ma thuật khác nhau không?


14

Nếu tôi có một regex ma thuật Vim theo nghĩa đen, có cách nào để chuyển đổi toàn bộ regex thành một biểu diễn thay thế sử dụng một chế độ ma thuật khác, vì vậy tôi có thể dán regex tương đương đó vào mã nguồn không?

Chẳng hạn, nếu tôi muốn chuyển đổi mẫu chế độ ma thuật này:

'\m-\=\<\d\+L\=\>\|0[xX][0-9a-fA-F]\+\>'

đến chế độ rất ma thuật để làm cho nó dễ đọc hơn, đại loại như:

'\v-=<\d+L=>|0[xX][0-9a-fA-F]+>'

Tôi thường mắc lỗi khi cố gắng chuyển đổi chúng bằng tay.


Tôi không biết về một. Bạn có kế hoạch để luôn luôn có chúng trong chuỗi trích dẫn duy nhất?
FDinoff

Có lẽ đây có thể là một điểm khởi đầu. Tôi có tuy nhiên nó chỉ được thử nghiệm.
Christian Brabandt

Liên quan đến tiêu đề câu hỏi, thật khó, hãy suy nghĩ về việc chuyển đổi một regex rất kỳ diệu [0-9]+thành không có phép thuật ... ;-)
Kent

Vì vậy, tôi đã cố gắng tạo ra một plugin cho nó, nó là một công việc nhưng nó không hoàn hảo. Ngoài ra để tham khảo còn có một plugin chuyển đổi regy ruby ​​/ perl thành Vim regex, mã là ... rất lớn: eregex
statox

1
@MuMind Tôi nghĩ rằng tôi không hiểu loại so sánh nào bạn đang tìm kiếm :-) Và về việc cải thiện plugin, đừng ngần ngại kiểm tra nó bằng cách sử dụng github để báo hiệu lỗi hoặc thậm chí đề xuất yêu cầu kéo, Tôi sẽ vui vẻ nhìn nó!
statox

Câu trả lời:


3

Lệnh

:s\v\\(\W)/\1/

nên đủ để chuyển đổi hầu hết các mô hình thành \vchế độ. \mMặc dù vậy, nó sẽ không trao đổi điểm đánh dấu của lil - và theo hiểu biết của tôi thì điều đó là không thể trong một lần thay thế. Nó đủ ngắn để nhập thủ công, và sau đó bạn chỉ có thể làm :s/\\m/\\vcho điểm đánh dấu chế độ.

\Wlà viết tắt [^a-zA-Z0-9_]của tập hợp các ký tự (phủ định) mà chế độ ma thuật hoạt động. Điều này chỉ xóa bất kỳ dấu gạch chéo ngược ngay trước một trong những ký tự đó. Vấn đề đã biết: Điều này sẽ thay thế các \\chuỗi bên trong \. Bạn có thể thay thế \Wbằng \c[^a-z0-9\_]để giảm thiểu điều này, nhưng nó vẫn gây rối cho chữ regex của bạn nếu bạn chạy nó nhiều lần và cũng thất bại trên các chuỗi thoát dài hơn ( \\\\ví dụ như chứa )

Cập nhật: Câu hỏi ban đầu làm cho nó không rõ ràng nếu bạn cần chuyển đổi \vtrở lại \m, nhưng lệnh có:

:s/\v(\\)@<!(\c[^a-z0-9\-\\\[\]\'_])/\\\2/
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.