elisp是否有正则表达式文字?


14

我的正则表达式需要的反斜杠数目非常疯狂。elisp是否有regexp文字,所以我可以写类似

rx"some\(regexp\)"

代替

"some\\(regexp\\)"

Emacs的突出了一些正则表达式构造,如\\|\\(\\)。不幸的是,在许多主题中这是不可见的。您可以覆盖font-lock-regexp-grouping-backslashfont-lock-regexp-grouping-construct使它更加与众不同。
Lindydancer 2015年

2
我制作了一个补丁程序以支持原始字符串文字,但是开发人员对此并不感兴趣。
knarf 2015年

1
您可以随时调整内容的显示方式,例如@ abo
abo的

@ knarf,Stefan对原始字符串支持不感兴趣是一个遗憾,因为原始字符串将是新regexp语法(我会支持)的补充,而不是替代。
鼻蛙

Answers:


13

一种选择是使用rx宏使用sexps构造表达式。

你的例子变成 (rx "some" (group "regexp"))

以下是rx.el注释部分的几个示例,以了解其rx工作原理:

^;;\\s-*\n\\|^\n 变成

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

[ \t\n]*:\\([^:]+\\|$\\) 变成

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

2
感谢您的编辑@knarf!我当时在打电话,不想举一个例子,我可能会弄错。:-)
glucas 2015年

实际上,由于rx语法的原因,我们实际上正在迁移许多使用大量正则表达式搜索的脚本并将其从perl替换为elisp ,这使得它们更易于维护。恕我直言,在类似情况下,rx语法本身使elisp成为Perl python,ruby等的理想替代品。谢谢。
gsl

7

不,它没有regexp文字,但是许多人发现pcre2el是一个有用的选择。

从elisp专门使用它是这样的:

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

那仍然需要您加倍反斜杠。对于平均正则表达式,您只是不需要那么多。
cjm 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.