2010-08-17 61 views
3

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

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

尽管我对正则表达式有所了解,但遇到这个基于字符串的elisp变体却把我抛弃了。

回答

6

首先,请记住,elisp的正则表达式必须被字符串转义,从而创建了大量额外的反斜杠。删除它们,我们得到

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

然后,\(和\)平均分组, “富\ |吧” 的意思是 “无论是富或酒吧”。

因此,这个正则表达式匹配:或者是一个emacs临时文件(以#开头,可能以句点开头:。?#。)或RCS文件(结尾于:v:。 ,v)或emacs备份文件(以〜:。*〜结尾)或svn目录(.svn)或cvs目录(CVS)或darcs目录(_darcs)。

编辑更正:正如andre-r正确指出的那样,反引号和单引号基本上是指“字符串的开始和结束”(分别)。因此,这意味着正则表达式找到的字符串恰好与上面概述的选项之一相匹配(即字符串开始,然后是其中一个选项,然后字符串结束)。我以前说过他们的意思是引用,我不知道我在想什么:)。谢谢你!

+0

只是一些修正,\\和''匹配空字符串,但只在匹配的缓冲区或字符串的开头(和结尾)。“ – 2010-08-17 18:37:21

+0

andre-r:当然!非常感谢,我一直在使用太多的胶乳:P我在编辑我的答案以反映这一点。 – rbp 2010-08-17 18:54:27

1

elisp regexes中的圆括号需要转义。字符串中的反斜杠需要被转义,所以当任何明智的正则表达式解析器只会使用()时,最终会得到\\(\\)。不要误解我的意思,我爱Emacs,但是在正则表达式中必须避免括号是一个非常糟糕的主意。管道和时段和反引号也正在逃脱 - 这就是为什么你有这个双反斜杠地狱。去掉那些和你(在正则表达式文字形式):

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

有关在elisp的逃脱括号的主题更多的讨论参见this question

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) 

一个更容易阅读 - 这是完全等价的。

+0

哇,我不知道rx.el - 它确实看起来非常有用,而且更具可读性。非常感谢你分享这个。 – codeasone 2010-08-18 19:30:35

+0

非常酷! +1 :) – rbp 2012-07-11 16:06:24