匹配字符串忽略注释

时间:2014-04-06 05:00:04

标签: regex emacs elisp emacs-faces font-lock

如果忽略字符串中的注释,我如何匹配Font Lock fontification的字符串? e.g。

(setq str-regexp "^foobar$"
      comment-regexp "/\\*[^*]*\\*/")

现在我如何返回匹配数据以在下面的缓冲区文本中为字符串“foobar”提供信息?

foo/*comment*/bar
fo/*comment*/obar
fooba/*comment*/r

我可以轻松地从缓冲区子字符串中删除注释,然后匹配该子字符串中的正则表达式,但我不知道如何将其转换回适合Font Lock的缓冲区标记/点。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

尝试使用库hide-comnts.el中的宏with-comments-hidden内的匹配代码。

EmacsWiki页面Hide Or Ignore Comments简要介绍了宏和库。

答案 1 :(得分:0)

也许你想删除文本中的所有评论:

使用以下正则表达式匹配注释:

((?:\/\*)(.*?)(?:\*\/))

然后将其替换为'',以仅生成未注释的文本。

结果文字:

foobar
foobar
foobar

演示

http://regex101.com/r/lC9vY1

答案 2 :(得分:0)

Font-lock支持另一种匹配单词的方法。它不是使用正则表达式,而是允许您调用函数来为它完成工作。

在此功能中,您可以匹配字母单词,随意浏览评论。该函数的唯一要求是行为类似re-search-forward,当找到匹配时返回非零值并相应地设置match-data

由于匹配的单词将包含注释,您必须编写字体锁定规则,以便为单词着色,但保持注释不变。您可以通过将规则中的OVERRIDE标记设置为keepappend(取决于您要执行的操作)来执行此操作。