2009-02-11 21 views
22

Tôi đã chơi đùa với các emacs lisp, và tôi muốn viết một chức năng nhỏ để thực hiện tìm kiếm biểu thức chính quy và thay thế. Tôi đã có một heck của một thời gian nhận được biểu thức chính quy để làm việc một cách chính xác bởi vì tôi đã không nhận ra rằng tất cả các ký tự đặc biệt cần phải được gấp đôi thoát khi viết lisp code (nhưng không phải khi sử dụng query-replace-regexp tương tác!).Emacs - cụm từ thông dụng trong Lisp cần phải được thoát kép - tại sao?

Vì vậy, ví dụ, sử dụng query-replace-regexp tương tác bạn có thể sử dụng

^\(.*\)[\t]-.*$ 

nhưng khi viết mã elisp bạn cần phải tăng gấp đôi thoát khỏi tất cả mọi thứ như vậy:

^\\(.*\\)[\t]-.*$ 

cuối cùng tôi đã tìm thấy một tham chiếu đến điều này trong một Steve Yegge article, nhưng tôi đã tự hỏi nếu có ai biết tại sao điều này là?

Trả lời

21

Đó là vì bạn cần phải thoát khỏi các dấu gạch chéo ngược trong chuỗi. Nếu bạn không thoát dấu gạch chéo ngược của \ (trong chuỗi nó chỉ là (

+0

Dang, điều ngược lại thoát ra chỉ có tôi khi tôi đăng :) Tôi đã phải đặt \\\ (để có được nó ngay – scottfrazer

+0

Ok, có ý nghĩa. Cảm ơn! –

+2

Điều tương tự là t rue của bất kỳ ngôn ngữ nào không có hỗ trợ cú pháp trực tiếp cho các regex và xây dựng chúng thông qua các chuỗi ký tự (ví dụ: Java, Javascript), phải không? –

8

scottfrazier là chính xác, một lần thoát được phân tích cú pháp khi chuỗi được đọc, chuỗi khác được phân tích cú pháp khi tạo biểu thức chính quy. dễ nhớ, nhưng nó có thể trở thành một nỗi đau, đặc biệt khi bạn đang cố gắng để phù hợp với một dấu gạch chéo ngược chữ '\'. Bạn sẽ phải làm điều đó bốn lần '\\' bởi vì bạn phải tăng gấp đôi dấu gạch chéo để phù hợp dấu gạch chéo ở cả phân tích chuỗi ban đầu và các biểu hiện phân tích cú pháp thông thường.

và khi bạn viết trên stack Overflow về vấn đề này, bạn phải sử dụng 8 slashes vì markdown sử dụng dấu gạch chéo cho một nhân vật chạy thoát là tốt.

18

Bạn đã có câu trả lời, nhưng một trợ lý được xây dựng trong để tạo các biểu thức chính quy bên trong Emacs là người xây dựng lại.

M-x re-builder 
+0

Tuyệt vời, tôi không biết về điều đó. Lần sau tôi làm điều này nó sẽ diễn ra suôn sẻ hơn nhiều. Cảm ơn bạn :). –

7

FWIW, emacs-lisp-mode sẽ fontify những biểu hiện đặc biệt (như \\(\\) cho bạn. Bạn có thể sau đó thay đổi khuôn mặt để được cái gì đó nổi bật.

(Họ là font-lock-regexp-grouping-constructfont-lock-regexp-grouping-backslash)

Các vấn đề liên quan