Search code examples
emacselisp

How do I create shy groups in Emacs with rx?


Generally, I can use the excellent rx macro to create readable regular expressions and be sure that I've escaped the correct metacharacters.

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

However, I can't work out how to create shy groups, e.g. \(?:AB\). rx sometimes produces them in its output:

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

but I want to explicitly add them. I can do:

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

but this defeats the point of rx.

In a perfect world, I'd like to be able to write:

(rx (shy-group "A"))

I'd settle for something like this (none of these work):

;; 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))))

How can I create regular expressions with shy groups using rx?


Solution

  • I think the structure of a rx form eliminates any need to explicitly create shy groups -- everything that a shy group could be needed for is accounted for by other syntax.

    e.g. your own example:

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