有人可以解释这个elisp regexp

时间:2010-08-17 15:57:11

标签: regex emacs elisp

有些人可以解释一下以下的正则表达式,我在ediff-trees.el中找到它作为从比较过程中排除哪些文件/目录的规范。

"\\`\\(\\.?#.*\\|.*,v\\|.*~\\|\\.svn\\|CVS\\|_darcs\\)\\'"

虽然我对正则表达式有些熟悉,遇到这个基于字符串的elisp变种让我失望。

3 个答案:

答案 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