我正在尝试学习如何编写emacs主模式。网上有很多很棒的教程(例如http://www.emacswiki.org/emacs/GenericMode),但是我很难学习正则表达式匹配的语法。例如,from this answer我试图了解原因
'(("\"\\(\\(?:.\\|\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 :(得分:2)
回答你关于正则表达式的问题---
您引用的示例中的正则表达式实际上是"\"\\(\\(?:.\\|\n\\)*?[^\\]\\)\""
。
要匹配的部分是:
\"
,只匹配"
字符 - 这是正则表达式的开头和结尾。
一个组,其中包含\\(?:.\\|\n\\)*?
后跟[^\\]
。该组可能在那里,以便可以告诉font-lock-keywords
对匹配的那一部分做某事,即在开头和结尾匹配"
之间的部分。
\\(?:.\\|\n\\)*?
,该组的第一部分,匹配零个或多个字符---任何字符。 *?
可能只是*
(同样的事情)。 .
匹配除换行符之外的任何char,\n
匹配换行符char。 \\|
表示其中任何一个都可以。
[^\\]
匹配除反斜杠(\
)以外的任何字符。
所以把它放在一起,该组匹配零个或多个字符,然后是一个不是反斜杠的字符。为什么不在"
个字符之间使用匹配零个或多个字符的正则表达式?大概是因为这个人想确保结尾"
没有被逃脱(通过反斜杠)。但请注意,正则表达式要求"
字符之间至少有一个字符,以便正则表达式与空字符串""
不匹配。