2013-08-31 120 views
1

我正在嘗試學習如何編寫emacs主模式。網上有很多很棒的教程(例如http://www.emacswiki.org/emacs/GenericMode),但我很努力學習正則表達式匹配的語法。例如,from this answer我試圖理解爲什麼主要模式的lisp emacs正則表達式

'(("\"\\(\\(?:.\\|\n\\)*?[^\\]\\)\""

(define-derived-mode rich-text-mode text-mode "Rich Text" 
    "text mode with string highlighting." 

    ;;register keywords 
    (setq rich-text-font-lock-keywords 
     '(("\"\\(\\(?:.\\|\n\\)*?[^\\]\\)\"" 0 font-lock-string-face))) 
    (setq font-lock-defaults rich-text-font-lock-keywords) 
    (font-lock-mode 1)) 

匹配雙引號之間的任何東西。此材料:http://www.gnu.org/software/emacs/manual/html_node/elisp/Regexp-Special.html#Regexp-Special 似乎沒有解釋。

那裏有更好的資源嗎?

+0

當呈現一個節點「Regexp-Special」,它明顯涵蓋了一些特殊情況時,應該能夠向上看「正則表達式的語法」,而不是向試圖幫助的人投票。 –

回答

2

回答你的問題是什麼正則表達式--- 你引用的例子中的正則表達式實際上是"\"\\(\\(?:.\\|\n\\)*?[^\\]\\)\""

要匹配的部分是:

  • \",其只匹配一個"炭---這是在開始和正則表達式的結尾。

  • 一組,其中包含\\(?:.\\|\n\\)*?,然後是[^\\]。該組大概在那裏,以便font-lock-keywords可以被告知在比賽的那一部分,即匹配的"之間的部分開始和結束。

  • \\(?:.\\|\n\\)*?,該組的第一部分匹配零個或多個字符---任何字符。 *?可能只是*(同樣的事情)。 .與除換行符字符以外的任何字符匹配,並且\n匹配換行符字符。 \\|意味着其中任何一個都沒問題。

  • [^\\]匹配除反斜槓(\)以外的任何字符。

因此,把它放在一起,組匹配零個或多個字符,後跟一個不是反斜槓的字符。爲什麼不使用匹配"字符之間的零個或多個字符的正則表達式?大概是因爲這個人想確保結尾"沒有逃脫(通過反斜槓)。但是,請注意,正則表達式要求在"字符之間存在至少一個字符,以便正則表達式與空字符串""不匹配。

一個好的資源是:http://www.emacswiki.org/emacs/RegularExpression

+0

謝謝@德魯,這非常有幫助!然而,你包含的資源鏈接讓我感到困惑。它沒有解釋爲什麼'\\'工作,或':'。 – DilithiumMatrix

+1

有關正則表達式的最佳參考文檔是Elisp手冊,它解釋了關於'\\'和':'的解釋。從節點「正則表達式」開始。兩者都在節點'Regexp Backslash'中解釋。有關在Lisp字符串中使用反斜槓的信息,另請參閱節點「用於字符串的語法」。請記住Info中的'i'是你找到事物的朋友,'g'會直接將你帶到給定的節點 – Drew