【问题标题】:lisp emacs regex syntax for major modes主要模式的 lisp emacs 正则表达式语法
【发布时间】:2013-08-31 15:06:30
【问题描述】:

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

那里有更好的资源吗?

【问题讨论】:

  • 当呈现一个节点“Regexp-Special”时,它显然涵盖了一些特殊情况,您应该能够向上查看“Regexps 的语法”,而不是对试图提供帮助的人投反对票。跨度>

标签: regex emacs syntax elisp major-mode


【解决方案1】:

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

要匹配的部分是:

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

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

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

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

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

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

【讨论】:

  • 感谢@Drew,这非常有帮助!但是,您包含的资源链接让我感到困惑。它没有解释为什么\\ 工作,或: 。
  • 关于正则表达式的最佳参考文档,它确实解释了 \\ 和 :,是 Elisp 手册。从节点Regular Expressions 开始。两者都在节点Regexp Backslash 中进行了解释。有关在 Lisp 字符串中使用反斜杠的信息,另请参阅节点 Syntax for Strings。请记住,Info 中的i 是您查找东西的朋友,g 直接将您带到给定节点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多