Hỗ trợ cho regex nhìn phía sau và phía trước?


12

Tôi cần phải thực hiện thay thế truy vấn regex, như vậy

footrong foo barlà phù hợp, nhưng footrong foo bazlà không. Thông thường tôi sẽ sử dụng regex nhìn về phía trước, ví dụ foo(?=bar).

Tuy nhiên, có vẻ như Emacs không thể làm điều này? Vim dường như có khả năng , nhưng chế độ ác trong spacemacs thì không thể.


Ngoài ra còn có: github.com/gamesun/emacs-regex-lookaround , nhưng tôi đã không thử xây dựng với bản vá này và có vẻ như đã được một thời gian.
wvxvw

Câu trả lời:


10

Không, biểu thức chính quy của Emacs không hỗ trợ các xác nhận nhìn về phía trước / phía sau tùy ý.

nb Evil và Spacemacs (giống như tất cả các thư viện elisp) không liên quan khi đặt câu hỏi về việc triển khai ngôn ngữ Emacs Lisp.


Vì vậy, nó là không thể để thay thế footrong foobarnhưng không phải trong foobaz? Đây là một hoạt động đủ phổ biến mà tôi nghĩ rằng phải có một giải pháp. Có lẽ nhìn về phía trước và phía sau là cách tiếp cận sai?
Heisenberg

Điều này không hoàn toàn tương đương, nhưng thay thế foo\(bar\)bằng baz\1sẽ là đủ trong mọi trường hợp barkhông chứa kết quả khớp thêm.
phils

Nếu bạn đang viết elisp, bạn có rất nhiều sự linh hoạt và nếu bạn thay thế một cách tương tác, bạn có thể gọi elisp tùy ý trong khi thay thế, vì vậy cuối cùng có nhiều cách để làm những điều này. Không thuận tiện như bạn có thể làm với những khẳng định đó.
phils

ví dụ: thay thế foobằng \,(if (looking-at "bar") "baz" \&)sẽ thay thế foobằng baznếu văn bản sau là bar(và thay thế foobằng foocách khác). Điều này vẫn không giống với chỉ phù hợp foo khi nó đi theo bar, nhưng đó là một lựa chọn khác.
phils

Tôi đoán điều này giống như những gì bạn đã nói ở trên, nhưng có vẻ như bạn có thể gõ: CSM-% foo \ (bar \) RET FOO \ 1 RET để thay thế tất cả thanh foo bằng thanh FOO, nhưng để tất cả foo baz. Đây có phải là thiếu một số điều bạn muốn?
John Kitchin
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.