有些人可以解释一下以下的正则表达式,我在ediff-trees.el中找到它作为从比较过程中排除哪些文件/目录的规范。
"\\`\\(\\.?#.*\\|.*,v\\|.*~\\|\\.svn\\|CVS\\|_darcs\\)\\'"
虽然我对正则表达式有些熟悉,遇到这个基于字符串的elisp变种让我失望。
答案 0 :(得分:6)
首先,请记住,elisp的正则表达式必须进行字符串转义,这会产生许多额外的反斜杠。删除它们,我们得到
\`\(\.?#.*\|.*,v\|.*~\|\.svn\|CVS\|_darcs\)\'
然后,\(和\)表示分组,“foo \ | bar”表示“foo或bar”。
因此,这个正则表达式匹配:emacs临时文件(以#开头,可能以句号开头:。?#。)或RCS文件(以v :.结尾)。 ,v),或emacs备份文件(以〜:。*〜结尾),或svn目录(.svn),cvs目录(CVS)或darcs目录(_darcs)。
编辑纠正:正如andre-r正确指出的那样,反引号“和单引号”基本上是指“字符串的开头和结尾”(分别)。所以这意味着regexp找到的字符串恰好与我上面列出的一个选项匹配(即字符串开始,然后是其中一个选择,然后字符串结束)。我之前说他们的意思是引用,我不知道我在想什么:)。谢谢andre-r!
答案 1 :(得分:4)
对不起,这不是一个真正的答案;这只是对rbp答案的评论。但我无法弄清楚如何让代码示例在注释中很好地呈现,而在这个答案中它看起来很好。
反正:
我不知道你,但我找到了
(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)
更容易阅读 - 而且完全相同。
答案 2 :(得分:1)
elisp正则表达式中的括号需要转义。字符串中的反斜杠需要进行转义,因此当任何合理的正则表达式解析器只使用\\(
和\\)
时,您最终会得到(
和)
。不要误会我的意思,我喜欢Emacs,但是在正则表达式中不得不逃避括号是一个非常糟糕的主意。管道,周期和反叛也正在逃脱 - 这就是为什么你有这种双重反冲的原因。删除那些,你得到(以正则表达式字面形式):
`(.?#.*|.*,v|.*~|\.svn|CVS|_darcs)'
有关elisp中逃脱的问题的更多讨论,请参阅this question。