Emacs - Lisp中的正则表达式需要双重转义 - 为什么?

时间:2009-02-11 21:17:11

标签: regex emacs elisp

我一直在玩emacs lisp,我想编写一个小函数来进行正则表达式搜索和替换。我有一段时间让正则表达式正常工作,因为我没有意识到在编写lisp代码时需要对所有特殊字符进行双重转义(但在交互式使用query-replace-regexp时则不行!)。

例如,以交互方式使用query-replace-regexp,您可以使用

^\(.*\)[\t]-.*$

但是在编写elisp代码时,您需要双重转义所有内容:

^\\(.*\\)[\t]-.*$  

我终于在Steve Yegge article找到了对此的引用,但我想知道是否有人知道这是为什么?

4 个答案:

答案 0 :(得分:21)

这是因为你需要在字符串中转义反斜杠。如果你没有逃避字符串中\(的反斜杠,那么结果只是(

答案 1 :(得分:18)

您已经有了答案,但是在Emacs中创建正则表达式的内置助手正在重新构建。

M-x re-builder

答案 2 :(得分:9)

scottfrazier是正确的,在读取字符串时解析一个转义符,在创建正则表达式时解析另一个转义符。这很容易记住,但它可能会变得很痛苦,特别是当你试图匹配文字反斜杠'\'时。您最终必须执行四次'\\\\',因为您必须使用双斜杠来匹配初始字符串解析和正则表达式解析中的斜杠。

当你在Stack Overflow上写这个问题时,你必须使用8 slashes,因为markdown也使用斜杠作为转义字符。

答案 3 :(得分:8)

FWIW,emacs-lisp-mode将使特殊表达形式(如 \\(\\)适合您。然后,您可以更改面 突出的东西。

(他们是font-lock-regexp-grouping-constructfont-lock-regexp-grouping-backslash