regex - 在emacs的“自定义”模式下,要转义正则表达式需要多少个反斜杠?

标签 regex emacs elisp backslash

我正在尝试使用emacs的customize-group软件包来调整我的设置的某些部分,但遇到了麻烦。通过自定义进行更改后,在.emacs文件中看到了类似的内容:

'(tramp-backup-directory-alist (quote (("\\\\`.*\\\\'" . "~/.emacs.d/autobackups"))))


这是将以下内容放入自定义文本字段的结果:

Regexp matching filename: \\`.*\\'


这是一个有代表性的示例:我实际上是在尝试更改一些需要使用正则表达式的东西,它们都显示出相同的问题。真的有几层报价?我似乎找不到反斜杠的神奇数目来使gosh-dang事情按我的要求去做,即使对于最简单的正则表达式(例如.*)也是如此。现在,给定的自定义产生了-什么都没有。它与emacs的默认行为保持不变。

更好的是,这是在哪里记录的?对于Google来说,这有点困难,但是我一直在那里尝试很多事情,在官方文档和Emacs Wiki中也尝试过。在定制模式下使正则表达式真正起作用需要多少悬挂反斜杠的权威来源在哪里-或至少会因某种警告而失败而不是无声地失败?



编辑:愤怒通常会问一些问题,我问的是错误的问题。幸运的是,以下答案使我找到了我所需要的问题的答案,即引用规则。我将尝试写下在这里学到的东西,因为我发现文档和Googleable资源对此非常晦涩。因此,这是我通过反复试验发现的报价规则,希望它们能对其他人有所帮助,启发纠正或两者兼而有之。

当emacs定制模式缓冲区要求您提供“正则表达式匹配文件名”时,就像emacs经常那样,它既简洁又特质(将the creator's personality赋予创建的频率!)。一方面,它意味着一个正则表达式,它将与文件的整个路径进行比较以查找匹配项,而不仅仅是您可能从术语“文件名”中假设的文件本身的名称。例如,这与emacs的buffer-file-name函数中使用的“文件名”相同。

此外,尽管如果将foo放在该字段中,则会看到"foo"(带有双引号)写入了实际文件,但引用不足,引用也不正确。据我所知,您需要使用仅emacs使用的引用样式引用正则表达式:“ backtick-foo-single-quote”方案。然后您需要对其进行转义,并将其设置为\`backslash-backtick-foo-backslash-single-quote\'(如果您认为在Markdown中输入内容令人头疼,那么在emacs中更是如此)。

最重要的是,emacs似乎有一个规则,即. regexp特殊字符与文件名开头的/不匹配,因此,正如上面我所碰到的那样,经典的.*模式将显示为什么都不匹配:要匹配“所有文件”,实际上需要使用regexp /.*,然后将其填充到custom-mode的引号格式中以生成\`/.*\',然后customize在其上绘制另一层转义符并将其写入到定制文件。

我的一项努力的最终结果-一种设置,使#autosave#文件不会堆积您正在使用的目录,而是全部驻留在一个地方:

(custom-set variables
  '(auto-save-file-name-transforms (quote (
    ("\\`/[^/]*:\\([^/]*/\\)*\\([^/]*\\)\\'" "~/.emacs.d/autobackups/\\2" t)
    ("\\`/.*/\\(.*?\\)\\'" "~/.emacs.d/autobackups/\\1" t)
))))


与括号相比,elisp中的反斜杠对您的理智性构成的威胁要大得多。



编辑2:是时候让我再次错了。我终于找到了相关的文档(当然,通过阅读another Stack Overflow question!):Regexp Backslash Constructs。对我来说,最关键的困惑是:在此情况下,反引号和单引号没有被引用:它们等同于perl的^$特殊字符。反斜杠-backtick构造与被检查的字符串开头处锚定的空字符串匹配,反斜杠-单引号构造与要考虑的字符串结尾处的空字符串匹配。 “考虑中的字符串”是指“缓冲区,在这种情况下,它恰好只包含一个文件路径,但是如果您想完全匹配,则需要匹配整个dang,因为这是elisp的全局regexp行为”。

向上帝发誓,这就像在处理外星文明一样。



编辑3:为了避免混淆未来的读者-


\`是用于“缓冲区开始”的emacs正则表达式。 (请参见Perl's \A
\'是“缓冲区末尾”的emacs正则表达式。 (请参阅Perl的\Z
^是“行首”的通用用法正则表达式。可以在emacs中使用。
$是“行尾”的常见用法正则表达式。可以在emacs中使用。


因为跨多行文本的正则表达式搜索在emacs中比在其他地方(例如M-x occur)更常见,所以在emacs中使用反引号和单引号特殊字符,并且据我所知,它们在自定义模式的上下文,因为如果您考虑向自定义模式字段输入通用的未知输入,则该字段可能包含换行符,因此您要使用缓冲区开头和缓冲区结尾特殊字符,因为开头和结尾输入的结尾不能保证是一行的开始和结尾。

我不确定是否后悔劫持了我自己的Stack Overflow问题并将其本质上变成了博客文章。

最佳答案

在自定义字段中,您将根据syntax described here输入正则表达式。当Customize将正则表达式写入字符串时,按照常规的字符串转义约定,正则表达式中的任何反斜杠或双引号字符都将被转义。

简而言之,只需在regexp字段中输入单反斜杠,它们就会在写入custom-set-variables的结果.emacs子句中正确加倍。

另外:由于您的正则表达式用于匹配文件名,因此您可以尝试打开一个包含要匹配文件的目录,然后运行M-x re-builder RET。然后,您可以以转义字符串的格式输入正则表达式,以确认它与那些文件匹配。通过在Dired缓冲区中键入% m,您可以以非转义格式输入正则表达式(即,就像在custom域中一样),并且Dired将标记匹配的文件名。

关于regex - 在emacs的“自定义”模式下,要转义正则表达式需要多少个反斜杠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8103181/

相关文章:

emacs - 错误的类型参数 : stringp, nil

emacs - Emacs elisp 回溯中奇怪的转义序列

regex - Powershell-用于限制大写和第一个小写的正则表达式,其后仅是小写和数字

regex - 正则表达式(普通或嵌套括号)

eclipse - Emacs颜色语法配置

emacs - 使用recentf 强制emacs 最近的文件忽略指定的文件(例如.windows 和.revive)

emacs - 如何配置spacemacs使其在启动时执行代码?

正则表达式:提取由特定单词分隔的单词

javascript - 验证逗号分隔的数字

emacs - 不要截断 emacs 包列表中的包名称。