主要模式的lisp emacs正则表达式语法

时间:2013-08-31 15:06:31

标签: regex emacs syntax elisp major-mode

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

那里有更好的资源吗?

1 个答案:

答案 0 :(得分:2)

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

要匹配的部分是:

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

  • 一个组,其中包含\\(?:.\\|\n\\)*?后跟[^\\]。该组可能在那里,以便可以告诉font-lock-keywords对匹配的那一部分做某事,即在开头和结尾匹配"之间的部分。

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

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

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

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