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

问题描述:

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

因此,例如,使用查询替换,正则表达式交互,你可以使用

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

但是写elisp的代码时,你需要加倍逃避一切都像这样:

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

我终于找到了在Steve Yegge article中提到这个,但我想知道是否有人知道这是为什么?

这是因为你需要在字符串中跳出反斜杠。如果你不逃避\的反斜杠(在字符串中它只是(

+0

Dang,当我发布时,反斜杠转义事物刚刚给我带来:)我不得不把它放在\\\\\(为了得到它 – scottfrazer 2009-02-11 21:26:13

+0

好吧,这是有道理的,谢谢! – 2009-02-11 21:43:11

scottfrazier是正确的,当字符串被读取时解析一个转义符,创建正则表达式时解析另一个转义符。容易记住,但它可能会变成一种痛苦,尤其是当你试图匹配一个字面反斜杠'\'。你最终必须做四次'\\\\',因为你必须双斜杠才能匹配斜线在初始字符串解析和正则表达式解析两者。

当你写堆栈溢出关于这个问题,你必须使用8 slashes,因为降价使用斜杠转义字符为好。

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

M-x re-builder 

FWIW,emacs-lisp-mode将fontify的独特的表达(如 \\(\\)你。然后你可以改变的面孔是 东西脱颖而出。

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