1

我正在尝试学习如何编写 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 似乎没有解释这一点。

有没有更好的资源?

4

1 回答 1

2

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

要匹配的部分是:

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

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

  • \\(?:.\\|\n\\)*?,组的第一部分,匹配零个或多个字符——任何字符。*?可能只是*(同样的事情)。匹配除换行符以外的.任何字符,并且\n匹配换行符。这\\|意味着其中任何一个都可以。

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

因此,将其放在一起,该组匹配零个或多个字符,后跟一个不是反斜杠的字符。为什么不只使用匹配字符之间零个或多个字符的正则表达式"?大概是因为这个人想确保结尾"没有逃脱(通过反斜杠)。但是,请注意,正则表达式要求字符之间至少有一个"字符,因此正则表达式与空字符串 . 不匹配""

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

于 2013-08-31T17:08:37.120 回答