Thực tế, có bốn re-builder
tùy chọn cú pháp khác nhau và bạn có thể chuyển đổi giữa chúng vớiC-cTAB
Hai là dành cho trình biên dịch regrec dạng sexp rx
và sregex
(nhưng vì trước đây là toàn diện hơn và gần như hoàn toàn tương thích cú pháp, bạn thực sự có thể bỏ qua sregex trừ khi bạn tình cờ làm việc với mã cũ đã sử dụng nó).
Hai tùy chọn cú pháp khác là read
(mặc định) và string
(là cú pháp bạn sử dụng tương tác).
Các read
cú pháp là cú pháp 'mã' - tức là công nhận bởi người đọc lisp - trong đó bạn nhập regexp theo cú pháp đọc cho chuỗi :
C-hig (elisp) Syntax for Strings
RET
Các string
cú pháp (mà tôi đã luôn luôn được coi là một tên khó hiểu không cần thiết trong bối cảnh này) là cấu trúc của một chuỗi biểu thức chính quy mà đã được đọc , và do đó không có bất kỳ nhân vật thoát cần thiết khi viết chuỗi. Có thể nói, đây là cú pháp biểu thức chính quy thực tế , giống như bạn sử dụng khi Emacs nhắc bạn tương tác.
Nếu bạn muốn sử dụng cú pháp chuỗi theo mặc định, hãy thêm đoạn mã sau vào tệp init của bạn hoặc sử dụng M-x customize-option
RET reb-re-syntax
RET
(setq reb-re-syntax 'string)
Lưu ý rằng bạn có thể chuyển đổi qua lại giữa cú pháp đọc và chuỗi khi chỉnh sửa biểu thức chính quy, không mất dữ liệu. Bạn cũng có thể chuyển từ các hình thức sexp sang cú pháp đọc / chuỗi (một cách tự nhiên; biên dịch sexps thành chuỗi là những gì các thư viện dành cho), nhưng bạn không thể đi theo hướng khác và tạo ra một sexp từ một chuỗi. người xây dựng lại ghi nhớ sexp là gì, vì vậy bạn không bị mất hình thức đó khi thay đổi cú pháp; nhưng nó cũng không được cập nhật nếu bạn sửa đổi biểu thức chính quy theo một cú pháp khác và sau đó thay đổi lại. Nói tóm lại, nếu bạn đang xây dựng regrec dưới dạng sexp, hãy đảm bảo bạn chỉ chỉnh sửa nó trong khi sử dụng cú pháp đó.
Một vấn đề với sự rx
hỗ trợ là nó thực sự sử dụng rx-to-string
hàm, nó không hoàn toàn giống với việc sử dụng rx
macro trong mã. rx
chấp nhận một số lượng đối số biểu mẫu tùy ý và coi chúng là một chuỗi ngụ ý , trong khi rx-to-string
chỉ chấp nhận một hình thức duy nhất và bất kỳ chuỗi cấp cao nhất nào cũng phải được làm rõ ràng '(sequence ...)
hoặc tương đương.
Nói tóm lại, khi bạn nhập một biểu mẫu '(...)
trong trình xây dựng lại, nó được xử lý như là (rx-to-string '(...))
và không(rx ...)
Ngoài ra, hãy lưu ý rằng một biểu mẫu không hợp lệ có thể khiến re-builder
ngừng cập nhật động các kết quả khớp trong bộ đệm được liên kết, ngay cả sau khi biểu mẫu được xác thực lại. Các C-cC-uràng buộc cho reb-force-update
là hữu ích để giải quyết các tình huống này.
Theo mặc định, dòng chế độ hiển thị "RE Builder" khi sử dụng read
hoặc string
cú pháp và "RE Builder Lisp" khi sử dụng rx
hoặc sregex
cú pháp, nhưng có vẻ hữu ích hơn nhiều khi xác định cú pháp cụ thể được sử dụng (đặc biệt là để phân biệt giữa read
và string
).
Nếu bạn cài đặt delight
gói từ GNU ELPA, bạn có thể sử dụng cách sau để thêm chỉ báo cú pháp vào dòng chế độ.
(let ((name '("Regexp[" (:eval (symbol-name reb-re-syntax)) "]")))
(delight `((reb-mode ,name :major)
(reb-lisp-mode ,name :major))))
Điều này thay đổi tên chế độ thành "Regapi [read]" theo read
cú pháp và tương tự cho các chế độ khác.
Hoặc để bao gồm một gợi ý cho rx
vs rx-to-string
gotcha được mô tả ở trên, hãy đặt dòng chế độ nói "Regapi [rx-to-string]" khi sử dụng rx
cú pháp:
(let ((name '("Regexp["
(:eval (symbol-name (if (eq reb-re-syntax 'rx)
'rx-to-string
reb-re-syntax)))
"]")))
(delight `((reb-mode ,name :major)
(reb-lisp-mode ,name :major))))