我正在使用 rx 功能在 ELISP 中生成来自性别的正则表达式,但无法弄清楚如何生成正则表达式“\\ documentclass”用于org-export-latex-classes:
(rx "\\documentclass")
(rx "\\" "documentclass")
(rx (char "\\") "documentclass")
评估时分别给出以下输出:
"\\\\documentclass"
"\\\\documentclass"
"[\\]documentclass"
“\\ documentclass”是否等同于“[\\] documentclass”?---我认为是,但我不确定。我可以使用rx生成前者吗?
编辑:虽然问题是有效的,但我发现我的动机不是;因为org-export-latex-classes使用字符串而不是正则表达式。
答案 0 :(得分:4)
Emacs需要使用双引号读取语法对字符串进行转义,因此,当代码由 lisp reader 处理时,{ {1}}计算为包含单个\
字符的字符串 object ;因此,单个反斜杠是正则表达式引擎在使用该字符串对象时所看到的。
但是,正则表达式中的"\\"
也具有转义函数,这意味着正则表达式中的序列\
与单个\
匹配。 / p>
要表示Emacs字符串(读取语法)中的序列\\
,每个反斜杠本身必须通过在其前面添加反斜杠来进行转义。
因此\
评估为包含\\
的字符串,该字符串可用作与单个"\\\\"
匹配的正则表达式。
在正则表达式字符替换序列中,反斜杠不会被转义;所以\\
由字符串\
表示,匹配单个反斜杠 - 该单字符集唯一可能的匹配。
因此用作regexps,字符串[\]
和"[\\]"
匹配相同的内容。
作为正则表达式的字符串"\\\\"
实际上与"[\\]"
完全相同,完全没有反斜杠,因为它是在正则表达式中转义的"\\documentclass"
(有效,但当然没必要)。
elisp手册解释如下:
"documentclass"
C-h i g d
RET