如何使用rx在Emacs中创建shy组?
通常,我可以使用优秀的如何使用rx在Emacs中创建shy组?,emacs,elisp,Emacs,Elisp,通常,我可以使用优秀的rx宏来创建可读的正则表达式,并确保转义了正确的元字符 (rx (any "A-Z")) ;; "[A-Z]" 但是,我不知道如何创建害羞群体,例如\(?:AB\)rx有时在其输出中产生它们: (rx (or "ab" "bc")) ;; "\\(?:ab\\|bc\\)" 但我想明确地添加它们。我可以做到: (rx (regexp "\\(?:AB\\)")) 但这违背了rx的观点 在一个完美的世界里,我希望能够写: (rx (shy-group "A")) 我会
rx
宏来创建可读的正则表达式,并确保转义了正确的元字符
(rx (any "A-Z")) ;; "[A-Z]"
但是,我不知道如何创建害羞群体,例如\(?:AB\)
rx
有时在其输出中产生它们:
(rx (or "ab" "bc")) ;; "\\(?:ab\\|bc\\)"
但我想明确地添加它们。我可以做到:
(rx (regexp "\\(?:AB\\)"))
但这违背了rx
的观点
在一个完美的世界里,我希望能够写:
(rx (shy-group "A"))
我会满足于这样的事情(这些工作都没有):
如何使用
rx
创建包含shy组的正则表达式?我认为rx
表单的结构消除了显式创建shy组的任何需要—shy组可能需要的所有内容都由其他语法解释
e、 g.你自己的例子:
(rx(或“ab”“bc”);;“\\(?:ab\\\\\\\ bc\)”
对于其他情况,也可以
示例(取自上面的EmacsWiki链接):
rx
表单的结构是否使显式害羞组变得多余?在什么情况下你需要这个?哦,我没想到。当我想重写一些字符串正则表达式以使用rx
时,我需要它。是否总是可以在rx
中重写任意正则表达式而无需显式分组?(你也基本上回答了这个问题,所以你想提交一个答案吗?)根据图书馆的评论,它说“Rx完全覆盖了所有的regexp特性”,我相信应该是这样的。
;; 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))))
(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)))