2009-06-29 35 views
8

Tôi đang cố gắng thực hiện search and replace with regexs.Thay thế Regex bằng Emacs

Giả sử tôi có foreach(foo1.txt, foo2.txt, foo3.txt, foo4.txt). Và tôi muốn đặt "xung quanh mỗi mục trong danh sách

tôi thought- từ tài liệu -. Rằng regex này sẽ làm việc (foo[1-4]\.txt) -> "\&"

Nhưng nó không Tôi đang làm gì sai

..?

Trả lời

8

Lưu ý rằng dấu ngoặc và dấu ngoặc không cần thoát ("thêm dấu gạch chéo") trong một tìm kiếm regexp, nhưng không phải trong thay thế regexp.

Thoát là bắt buộc vì trình phân tích cú pháp lisp đang xem regex trước động cơ regex.

Nhưng nếu bạn đang viết theo chương trình (trái ngược với mục nhập tương tác), bạn cần thoát khỏi thoát! ay-yi-yi ....

interactive: 
M-x replace-regexp RET \(obj.method(.*)\{1\}\) RET trim$(\1) 

programmatic: 
(replace-regexp "\\(obj.method(.*)\\{1\\}\\)" "trim$(\\1)") 

dấu trừ thoát được thoát vì chúng được nhóm, các dấu ngoặc kép không thoát được là dấu ngoặc vuông.

Bạn có thể muốn xem Emacs Wiki Regex Crash CourseSteve Yegge's Effective Emacs regex section.

+2

Có ích, nhưng hơi đáng sợ. "thoát khỏi trốn thoát". Meep. –

2

Hãy thử một cái gì đó như thế này \(foo[1-4]\.txt\)

2

Emacs regexps luôn bắt tôi ra, cos họ không Perl:

\(foo[1-4]\.txt\) 

Bạn cần phải gạch chéo dấu ngoặc trong Emacs.

1

Bạn đã có câu trả lời đúng về regexp, nhưng trong trường hợp này, có lẽ sẽ dễ sử dụng macro hơn. Đặt điểm vào đầu tên đầu tiên, và gõ:

C-x (" M-f M-f " C-f C-f C-x) 

Đó là, bắt đầu ghi vĩ mô, chèn trích dẫn, đi hai chữ chuyển tiếp, chèn trích dẫn, đi hai nhân vật chuyển tiếp cho các phần tử tiếp theo, và ngừng quay macro.

Sau đó chạy macro với C-x e. Để lặp lại, chỉ cần nhấn lại e.

(Trong Emacs 23, bạn có thể sử dụng F3 thay vì 'C-x (', và F4 thay vì cả 'C-x)' và 'C-x e'.)