我正在学习如何编写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.