Emacs 在elisp中,正则表达式[\\]documentclass和\\documentclass之间是否存在差异?

Emacs 在elisp中,正则表达式[\\]documentclass和\\documentclass之间是否存在差异?,emacs,elisp,Emacs,Elisp,我在ELISP中使用rx函数从sexps生成正则表达式,但不知道如何生成正则表达式\\documentclass以用于org导出类: (rx "\\documentclass") (rx "\\" "documentclass") (rx (char "\\") "documentclass") 评估时,分别给出以下输出: "\\\\documentclass" "\\\\documentclass" "[\\]documentclass" \

我在ELISP中使用rx函数从sexps生成正则表达式,但不知道如何生成正则表达式\\documentclass以用于org导出类:

    (rx "\\documentclass")
    (rx "\\" "documentclass")
    (rx (char "\\") "documentclass")
评估时,分别给出以下输出:

    "\\\\documentclass"
    "\\\\documentclass"
    "[\\]documentclass"
\\documentclass等同于[\\]documentclass吗?--我想是的,但不确定。我可以使用rx生成前者吗

编辑:虽然这个问题是正确的,但我意识到我的动机是错误的;因为org export latex类使用字符串而不是正则表达式。

Emacs要求在字符串的双引号读取语法中对\进行转义,因此,当代码由lisp读取器处理时,\计算为包含单个\字符的字符串对象;因此,当regexp引擎使用该字符串对象时,它会看到一个反斜杠

但是,regexp中的\也有一个转义函数,这意味着regexp中的序列\\与单个\匹配

要在Emacs字符串的读取语法中表示序列\\,必须通过在每个反斜杠前面加上反斜杠来转义这些反斜杠

因此,\\\计算为包含\\的字符串,该字符串可用作与单个\匹配的regexp

但是,在regexp字符替换序列中,反斜杠不会转义;因此,由字符串[\\]表示的[\]匹配一个反斜杠,这是该单个字符集唯一可能的匹配

因此用作regexp,字符串\\\\和[\\]匹配相同的内容

作为regexp的字符串\\documentclass实际上与documentclass相同,没有任何反斜杠,因为在regexp中转义的d是有效的,但当然是不必要的

elisp手册对此进行了如下解释:

`\'有两个功能:它引用特殊字符,包括 `\,并引入了其他特殊构造。 因为“\”引用了特殊字符,“\$”是一个常规字符 仅与“$”匹配的表达式,“\[”是正则表达式 仅与“[”匹配,依此类推。 注意,``在Lisp的read语法中也有特殊的含义 字符串*注意字符串类型:,并且必须用“\”引用。对于 例如,与“\”字符匹配的正则表达式是 `\\“。要编写包含字符“\\”的Lisp字符串,请执行以下操作:, Lisp语法要求用另一个“\”引用每个“\”。 因此,与“\”匹配的正则表达式的读取语法 是“\\\”。 [...] 由于“\”在字符替换中并不特殊,因此它永远不会 删除“-”或“]”的特殊含义。因此不应引用 当这些字符也没有特殊意义时。这将 不要澄清任何事情,因为反斜杠可以合法地在这些之前 具有特殊含义的字符,如“[^\]”、“[^\\]” 对于Lisp字符串语法,它匹配除 反斜杠。 C-hig elisp Regexp Special RET

Emacs要求\以双引号读取字符串语法进行转义,因此,当代码由lisp读取器处理时,\计算为包含单个\字符的字符串对象;因此,Regexp引擎在使用该字符串对象时会看到该单个反斜杠

但是,regexp中的\也有一个转义函数,这意味着regexp中的序列\\与单个\匹配

要在Emacs字符串的读取语法中表示序列\\,必须通过在每个反斜杠前面加上反斜杠来转义这些反斜杠

因此,\\\计算为包含\\的字符串,该字符串可用作与单个\匹配的regexp

但是,在regexp字符替换序列中,反斜杠不会转义;因此,由字符串[\\]表示的[\]与单个反斜杠匹配—这是该单个字符集唯一可能的匹配

因此用作regexp,字符串\\\\和[\\]匹配相同的内容

作为regexp的字符串\\documentclass实际上与documentclass相同,没有任何反斜杠,因为在regexp中转义的d是有效的,但当然是不必要的

elisp手册对此进行了如下解释:

`\'有两个功能:它引用特殊字符,包括 `\,并引入了其他特殊构造。 因为“\”引用了特殊字符,“\$”是一个常规字符 仅与“$”匹配的表达式,“\[”是正则表达式 仅与“[”匹配,依此类推。 注意,``在Lisp的read语法中也有特殊的含义 字符串*注意字符串类型:,并且必须用“\”引用。对于 例如,与“\”字符匹配的正则表达式是 `\\“。要编写包含字符“\\”的Lisp字符串,请执行以下操作:, Lisp语法要求用另一个“\”引用每个“\”。 因此,与“\”匹配的正则表达式的读取语法 是“\\\”。 [...] 作为一个“\”在内部不是特别的 作为一个角色的替代品,它永远不会 删除“-”或“]”的特殊含义。所以你不应该引用 这些字符也没有特殊意义。这会 不要澄清任何事情,因为反斜杠可以合法地在这些之前 具有特殊含义的字符,如“[^\]”、“[^\\]” 对于Lisp字符串语法,它匹配除 反斜杠。
C-hig elisp Regexp Special RET

感谢您澄清了问题。我曾试图在org export latex类中使用rx生成字符串,并将它们解释为类似于我为auto mode alist生成的reg表达式,但现在我清楚地看到它们不是。谢谢,这澄清了问题。我曾试图在org export latex类中使用rx生成字符串,并将它们解释为类似于我为auto-mode-alist生成的reg表达式,但现在我清楚地看到它们不是。