我在试着学习怎么写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))匹配双引号之间的任何内容。这个材料:node/elisp/Regexp-Special.html#Regexp-Special似乎不能解释这一点。
有什么更好的资源吗?
发布于 2013-08-31 17:08:37
对于你关于regexp做什么的问题的一个答案--你所举的例子中的regexp实际上是"\"\\(\\(?:.\\|\n\\)*?[^\\]\\)\""。
要匹配的部件如下:
\",它只匹配一个"字符--这是regexp的开头和结尾。\\(?:.\\|\n\\)*?,后面跟着[^\\]。这个组大概是为了让font-lock-keywords对匹配的那个部分做一些事情,也就是在开始和结束时匹配的"之间的部分。\\(?:.\\|\n\\)*?,这个组的第一部分,匹配零或多个字符--任何字符。*?可能只是* (同样的事情)。.匹配除换行符以外的任何字符,\n匹配换行符。\\|意味着其中任何一个都是可以的。[^\\]匹配除反斜杠(\)以外的任何字符。因此,把它放在一起,组匹配零或多个字符,后面是一个字符,而不是反斜杠。为什么不使用与"字符之间的零或多个字符匹配的regexp呢?大概是因为这个人想确保结束的"没有被转义(用一个反斜杠)。但是,请注意,regexp要求在"字符之间至少有一个字符,以便regexp与空字符串""不匹配。
一个好的资源是:http://www.emacswiki.org/emacs/RegularExpression。
https://stackoverflow.com/questions/18549517
复制相似问题