在elisp中,正则表达式[\\]文档类和\\ documentclass之间有区别吗?

时间:2012-06-02 13:48:50

标签: emacs elisp

我正在使用 rx 功能在 ELISP 中生成来自性别的正则​​表达式,但无法弄清楚如何生成正则表达式“\\ documentclass”用于org-export-latex-classes:

    (rx "\\documentclass")
    (rx "\\" "documentclass")
    (rx (char "\\") "documentclass")

评估时分别给出以下输出:

    "\\\\documentclass"
    "\\\\documentclass"
    "[\\]documentclass"

“\\ documentclass”是否等同于“[\\] documentclass”?---我认为是,但我不确定。我可以使用rx生成前者吗?

编辑:虽然问题是有效的,但我发现我的动机不是;因为org-export-latex-classes使用字符串而不是正则表达式。

1 个答案:

答案 0 :(得分:4)

Emacs需要使用双引号读取语法对字符串进行转义,因此,当代码由 lisp reader 处理时,{ {1}}计算为包含单个\字符的字符串 object ;因此,单个反斜杠是正则表达式引擎在使用该字符串对象时所看到的。

但是,正则表达式中的"\\"具有转义函数,这意味着正则表达式中的序列\与单个\匹配。 / p>

要表示Emacs字符串(读取语法)中的序列\\,每个反斜杠本身必须通过在其前面添加反斜杠来进行转义。

因此\评估为包含\\的字符串,该字符串可用作与单个"\\\\"匹配的正则表达式。

在正则表达式字符替换序列中,反斜杠不会被转义;所以\\由字符串\表示,匹配单个反斜杠 - 该单字符集唯一可能的匹配。

因此用作regexps,字符串[\]"[\\]"匹配相同的内容。

作为正则表达式的字符串"\\\\"实际上与"[\\]"完全相同,完全没有反斜杠,因为它是在正则表达式中转义的"\\documentclass"(有效,但当然没必要)。

elisp手册解释如下:

"documentclass"

C-h i g d RET