请问能否解释一下以下正则表达式的含义?我在ediff-trees.el中找到了这个表达式,它用于指定哪些文件/目录应该被排除在比较过程之外。
"\\`\\(\\.?#.*\\|.*,v\\|.*~\\|\\.svn\\|CVS\\|_darcs\\)\\'"
虽然我对正则表达式有一定了解,但遇到这种基于elisp字符串的变量还是让我不知所措。
首先,要记住elisp的正则表达式必须进行字符串转义,这会创建许多额外的反斜杠。去除它们后,我们得到:
\`\(\.?#.*\|.*,v\|.*~\|\.svn\|CVS\|_darcs\)\'
(rx bos (group (or (and (zero-or-one ".") "#" (zero-or-more nonl))
(and (zero-or-more nonl) ",v" )
(and (zero-or-more nonl) "~" )
".svn"
"CVS"
"_darcs"
))
eos)
阅读起来更加容易--它完全等效。
在elisp正则表达式中,括号需要转义。字符串中的反斜杠也需要转义,因此当任何合理的正则表达式解析器只使用(
和)
时,您最终会得到\\(
和\\)
。不要误会,我喜欢Emacs,但是在正则表达式中转义括号是一个非常糟糕的想法。管道符、句点和反引号也被转义了 - 这就是为什么你有这个双反斜杠的地狱。去掉它们,你就可以得到(以正则表达式字面形式):
`(.?#.*|.*,v|.*~|\.svn|CVS|_darcs)'
请参见此问题,了解有关elisp中转义括号的更多讨论。