有人能解释一下这个elisp正则表达式吗?

3

请问能否解释一下以下正则表达式的含义?我在ediff-trees.el中找到了这个表达式,它用于指定哪些文件/目录应该被排除在比较过程之外。

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

虽然我对正则表达式有一定了解,但遇到这种基于elisp字符串的变量还是让我不知所措。

3个回答

6

首先,要记住elisp的正则表达式必须进行字符串转义,这会创建许多额外的反斜杠。去除它们后,我们得到:

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

然后,\(和\)表示分组,“foo\|bar”表示“foo或bar”。因此,逐个部分,这个正则表达式匹配:emacs临时文件(以#开头的东西,可能在前面有一个句点:.?#.),或RCS文件(以,v结尾:.,v),或emacs备份文件(以~结尾:.*~),或svn目录(.svn),或cvs目录(CVS),或darcs目录(_darcs)。
编辑更正:正如andre-r正确指出的那样,反引号\`和单引号\'基本上意味着“字符串的开头和结尾”(分别)。因此,这意味着正则表达式找到与我上面列出的选择之一完全匹配的字符串(即,字符串以一个选择开头,然后以该字符串结束)。我之前说它们是引用,我不知道我在想什么:)。感谢andre-r!

只是一些更正,\`和'"匹配空字符串,但仅在缓冲区或字符串的开头(分别为结尾)与之匹配。 - andre-r
andre-r:当然!非常感谢,我一直在使用太多的LaTeX :P 我正在编辑我的答案以反映这一点。 - rbp

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)

阅读起来更加容易--它完全等效。


哇,我不知道rx.el - 它看起来非常有用,而且远比其他的更易读。非常感谢你分享这个。 - codeasone

1

在elisp正则表达式中,括号需要转义。字符串中的反斜杠也需要转义,因此当任何合理的正则表达式解析器只使用()时,您最终会得到\\(\\)。不要误会,我喜欢Emacs,但是在正则表达式中转义括号是一个非常糟糕的想法。管道符、句点和反引号也被转义了 - 这就是为什么你有这个双反斜杠的地狱。去掉它们,你就可以得到(以正则表达式字面形式):

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

请参见此问题,了解有关elisp中转义括号的更多讨论。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接