2013-08-31 63 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