Liệu elisp có nghĩa đen regrec?


14

Số lượng dấu gạch chéo ngược mà regexps của tôi yêu cầu là khá điên rồ. Có phải elisp có chữ regrec, vì vậy tôi có thể viết một cái gì đó như

rx"some\(regexp\)"

thay vì

"some\\(regexp\\)"

Emacs nhấn mạnh một số cấu trúc regexp như \\|, \\(, và \\). Thật không may, trong nhiều chủ đề này không thể nhìn thấy. Bạn có thể ghi đè font-lock-regexp-grouping-backslashfont-lock-regexp-grouping-constructđể làm cho điều này khác biệt hơn.
Lindydancer 9/2/2015

2
Tôi đã tạo một bản vá để hỗ trợ chuỗi ký tự thô nhưng các nhà phát triển không quan tâm.
knarf

1
Bạn luôn có thể điều chỉnh cách hiển thị mọi thứ, như trong bài đăng trên blog này của @ abo-abo: oremacs.com/2015/01/11/pretty-elisp-regex
glucas 9/2/2015

@knarf thật xấu hổ khi Stefan không quan tâm đến hỗ trợ chuỗi thô, bởi vì chuỗi thô sẽ là phần bổ sung cho cú pháp regrec mới (mà tôi sẽ ủng hộ), chứ không phải thay thế.
cái mũi

Câu trả lời:


13

Một tùy chọn là sử dụng rxmacro để tạo biểu thức của bạn bằng cách sử dụng sexps.

Ví dụ của bạn trở thành (rx "some" (group "regexp"))

Dưới đây là một vài ví dụ khác từ phần bình luận trong rx.el, để có ý tưởng về cách thức rxhoạt động:

Điều này ^;;\\s-*\n\\|^\n trở thành

(rx (or (and line-start ";;" (0+ space) ?\n)
        (and line-start ?\n)))

Điều này [ \t\n]*:\\([^:]+\\|$\\) trở thành

(rx (and (zero-or-more (in " \t\n")) ":"
         (submatch (or line-end (one-or-more (not (any ?:)))))))

2
Cảm ơn đã chỉnh sửa @knarf! Tôi đã nghe điện thoại và không muốn đưa ra một ví dụ rằng tôi có thể sai. :-)
glucas

Chúng tôi thực sự đang trong quá trình di chuyển nhiều tập lệnh sử dụng nhiều tìm kiếm regex và thay thế từ perl sang elisp vì rxcú pháp, giúp chúng dễ bảo trì hơn. Imho, đối với các trường hợp tương tự, chính cú pháp rx làm cho elisp trở thành một sự thay thế xứng đáng cho perl python, ruby, v.v ... Cảm ơn bạn.
gsl

7

Không, nó không có nghĩa đen , nhưng nhiều người tìm thấy pcre2el là một sự thay thế hữu ích.

Cụ thể sử dụng nó từ elisp như thế này:

(rxt-pcre-to-elisp "(abc|def)\\w+\\d+")
   ;; => "\\(\\(?:abc\\|def\\)\\)[_[:alnum:]]+[[:digit:]]+"

Điều đó vẫn đòi hỏi bạn phải tăng gấp đôi dấu gạch chéo ngược của bạn. Bạn không cần nhiều như vậy cho regrec trung bình.
cjm
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.