lisp-emacs主要模式的regex语法



我正在学习如何编写emacs主模式。网上有很多很棒的教程(例如。http://www.emacswiki.org/emacs/GenericMode),但我正在努力学习正则表达式匹配的语法。例如,从这个答案中,我试图理解为什么

'((""\(\(?:.\|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似乎无法解释这一点。

有更好的资源吗?

regexp的作用问题的答案---您引用的示例中的正则表达式实际上是""\(\(?:.\|n\)*?[^\]\)""

要匹配的部件有:

  • ",它只匹配一个"字符--它位于正则表达式的开头和结尾。

  • 一个组,包含\(?:.\|n\)*?[^\]。该组可能在那里,因此font-lock-keywords可以被告知对匹配的那部分,即在开始和结束时匹配的"之间的部分做一些事情。

  • \(?:.\|n\)*?,组的第一部分,匹配零个或多个字符——任何字符。CCD_ 10可能只是CCD_ 11(同样的事情)。.匹配除换行符以外的任何字符,n匹配换行符。\|表示其中任何一个正常。

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

因此,将其放在一起,该组匹配零个或多个字符,后面跟着一个不是反斜杠的字符。为什么不使用一个正则表达式来匹配"字符之间的零个或多个字符呢?可能是因为该人员希望确保结尾的"没有转义(通过反斜杠)。但是,请注意,regexp要求"字符之间至少有一个字符,因此regexp与空字符串""不匹配。

一个好的资源是:http://www.emacswiki.org/emacs/RegularExpression.

最新更新