Làm thế nào để thoát regrec ký tự đặc biệt trong một chuỗi?


9

Tôi đang soạn một biểu thức chính quy phức tạp và người dùng có thể cung cấp một phần của biểu thức. Tuy nhiên, phần do người dùng cung cấp nên được hiểu theo nghĩa đen, nghĩa là các ký tự đặc biệt regrec nên được thoát. Có một chức năng để thoát khỏi những nhân vật này? Nó có vẻ như là một điều phổ biến để làm nhưng tất cả sự googling của tôi đã không thành công.

Thí dụ:

(re-search-forward (format "\b%s\b" user-string))

Nếu user-stringtest*case, tôi muốn phù hợp test*casenhưng không testttttcase.

Câu trả lời:


12

Bạn có thể sử dụng regexp-quote:

Hàm này trả về một biểu thức chính quy có khớp chính xác duy nhất là chuỗi. Sử dụng biểu thức chính quy này trong tìm kiếm sẽ chỉ thành công nếu các ký tự tiếp theo trong bộ đệm là chuỗi; sử dụng nó trong một chức năng tìm kiếm sẽ thành công nếu văn bản được tìm kiếm có chứa chuỗi.

(regexp-quote "^The cat$") => \\^The cat\\$


1
Cảm ơn rất nhiều! Nhưng tại sao điều này rất khó tìm? Đôi khi tài liệu của Emacs làm tôi phát điên.
tmalsburg

2
Bạn có thể mô tả những gì bạn đã tìm kiếm và nơi bạn dự kiến ​​sẽ tìm thấy về chức năng này, với Mx báo cáo-emacs-bug. Có lẽ tài liệu còn thiếu và nên được sửa.
YoungFrog

2
@tmalsburg Một từ khóa hữu ích sẽ là "thoát". Có lẽ (defalias 'regexp-escape 'regexp-quote). Điều này đã được thảo luận trên bất kỳ danh sách gửi thư của emacs?
ebpa
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.