2010-08-17 48 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

相關問題