2012-08-12 11 views
5

Tôi đã sử dụng thành công thay thế regexp tương tác để thay thế mọi thể hiện của văn bản được trích dẫn trong bộ đệm được hiển thị bên dưới với một phiên bản không được trích dẫn. Regexp tôi đã tìm kiếm làHàm emacs có chức năng diễn giải lại các ký tự nhóm () trong regexp

\"\([^\"]*\)\" 

và NEWTEXT mà tôi đã chèn là \ 1.

* "PROJECT START" 
:PROPERTIES: 
:ID: 1 
:Unique_ID: 17 
:DURATION: "0 days" 
:TYPE: "Fixed Work" 
:OUTLINE_LEVEL: 1 
:END: 

Tương tác, văn bản aboe được chuyển thành văn bản bên dưới.

* PROJECT START 
:PROPERTIES: 
:ID: 1 
:Unique_ID: 17 
:DURATION: 0 days 
:TYPE: Fixed Work 
:OUTLINE_LEVEL: 1 
:END: 

tôi đã cố gắng để làm cùng tìm kiếm này và thay thế lập trình bằng cách chèn hai dòng sau

(while (re-search-forward "\"\([^\"]*\)\"" nil t) 
    (replace-match "\1" nil nil)) 

ở phía trên cùng của bộ đệm và thực hiện, nhưng nó chỉ đơn giản quay trở lại con số không mà không tìm thấy một trận đấu duy nhất.

Khi tôi bỏ qua các nhóm

\(\) 

và thay thế \ 1 với \ &

(while (re-search-forward "\"[^\"]*\"" nil t) 
    (replace-match "\&" nil nil)) 

tôi nhận được mỗi chuỗi trích dẫn thay thế bằng '&'.

* & 
:PROPERTIES: 
:ID: 1 
:Unique_ID: 17 
:DURATION: & 
:TYPE: & 
:OUTLINE_LEVEL: 1 
:END: 

Tất cả những gì tôi đã nhìn thấy trong tài liệu cho cả các chức năng này chỉ ra rằng họ nên nhận ra những ký tự đặc biệt, và các ví dụ về việc sử dụng nó trong phản ứng với các câu hỏi khác trên diễn đàn này sử dụng các ký tự đặc biệt.

Có ai có thể giúp tôi hiểu lý do nhóm và \ &, \ N, \ ký tự không được diễn giải chính xác không?

Trả lời

7

Bạn cần phải thoát khỏi "\" s cho "(", ")" và "\ 1". I.e .:

(while (re-search-forward "\"\\([^\"]*\\)\"" nil t) 
    (replace-match "\\1" nil nil)) 
+0

Đã khắc phục sự cố đó. Cảm ơn bạn rất nhiều! – user1593649

+2

Nếu nó không rõ ràng, điều này là bởi vì '' \ '' là đặc biệt cho chuỗi (cũng như để regexps). Vì vậy, khi bạn cung cấp một regexp trong định dạng chuỗi, bất kỳ dấu gạch chéo ngược cần phải được thoát, nếu không kết quả của việc đánh giá chuỗi sẽ không phải là regexp bạn dự định. – phils

+0

@ user1593649: Đừng quên rằng bạn có thể chấp nhận câu trả lời bằng cách nhấp vào dấu tick trống bên cạnh nó. –