【问题标题】:Emacs - regular expressions in Lisp need to be double-escaped - why?Emacs - Lisp 中的正则表达式需要双重转义 - 为什么?
【发布时间】:2010-10-07 00:48:22
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: regex emacs elisp


    【解决方案1】:

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

    【讨论】:

    • 该死,当我发布它时,反斜杠转义的东西让我感到了 :) 我必须输入 \\\\( 才能让它正确
    • 好的,有道理。谢谢!
    • 同样的事情也适用于任何对正则表达式没有直接句法支持并通过字符串文字(例如,Java、Javascript)构造它们的语言,对吧?
    • 这是真的,克里斯。我想我在 elisp 中被抛弃了,因为我不习惯转义 () 和 {} 字符。
    • @KevinTighe:请注意,在 Emacs-26 中,\{ 之类的反斜杠以红色突出显示,表示它可能是一个错误(因为这样的反斜杠没有任何作用)。跨度>
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      M-x re-builder
      

      【讨论】:

      • 太棒了,我不知道。下次我这样做时,它应该会顺利得多。谢谢你:)。
      【解决方案4】:

      FWIW, emacs-lisp-mode 将字体化特殊表达式(如 \\( 和 \\) 给你。然后,您可以将面更改为 突出的东西。

      (他们是font-lock-regexp-grouping-construct和font-lock-regexp-grouping-backslash)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-15
        相关资源
        最近更新 更多