5

一般来说,我可以使用出色的rx宏来创建可读的正则表达式,并确保我已经转义了正确的元字符。

(rx (any "A-Z")) ;; "[A-Z]"

但是,我不知道如何创建害羞的团体,例如\(?:AB\). rx有时会在其输出中产生它们:

(rx (or "ab" "bc")) ;; "\\(?:ab\\|bc\\)"

但我想明确添加它们。我可以:

(rx (regexp "\\(?:AB\\)"))

但这违背了rx.

在一个完美的世界里,我希望能够写:

(rx (shy-group "A"))

我会接受这样的事情(这些都不起作用):

;; sadly, `regexp` only accepts literal strings
(rx (regexp (format "\\(?:%s\\)" (rx WHATEVER))))

;; also unfortunate, `eval` quotes the string it's given
(rx (eval (format "\\(?:%s\\)" (rx WHATEVER))))

如何使用害羞组创建正则表达式rx

4

2 回答 2

5

我认为rx表单的结构消除了显式创建害羞组的任何需要——害羞组可能需要的所有内容都由其他语法来解释。

例如你自己的例子:

(rx (or "ab" "bc")) ;; "\\(?:ab\\|bc\\)"
于 2013-06-13T23:18:12.687 回答
2

对于其他情况,也可以扩展 rx 使用的关键字

示例(取自上面的 EmacsWiki 链接):

(defmacro rx-extra (&rest body-forms)
   (let ((add-ins (list
                   `(file . ,(rx (+ (or alnum digit "." "/" "-" "_"))))
                   `(ws0 . ,(rx (0+ (any " " "\t"))))
                   `(ws+ . ,(rx (+ (any " " "\t"))))
                   `(int . ,(rx (+ digit))))))
     `(let ((rx-constituents (append ',add-ins rx-constituents nil)))
        ,@body-forms)))
于 2016-04-11T11:07:29.690 回答