24

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

因此,例如,交互式地使用 query-replace-regexp 您可以使用

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

但是在编写 elisp 代码时,您需要像这样对所有内容进行双重转义:

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

我终于在 Steve Yegge 的一篇文章中找到了对此的参考,但我想知道是否有人知道这是为什么?

4

4 回答 4

22

这是因为您需要转义字符串中的反斜杠。如果你不逃避\(字符串中的反斜杠,结果只是(

于 2009-02-11T21:25:04.000 回答
18

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

M-x re-builder
于 2009-02-11T22:35:47.997 回答
10

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

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

于 2009-02-11T21:47:32.603 回答
8

FWIW,emacs-lisp-mode将字体化特殊表达(喜欢 \\(\\)为你)。然后你可以改变面孔是突出的东西。

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

于 2009-02-11T23:24:43.807 回答