【问题标题】:Unknown number of matches in regex and font-lock正则表达式和字体锁定中的未知匹配数
【发布时间】:2011-05-25 06:34:48
【问题描述】:

我正在尝试使用 font-lock 和 elisp 的正则表达式来突出显示如下内容:

class Foo implements A, B, C, D { }

问题是implements 之后的逗号分隔列表长度未知。我已经完成了突出显示列表中所有单词的正则表达式(使用 re-buider,突出显示 A、B、C 和 D):

"implements\\s-+\\(?:\\(\\sw+\\)\\s-*,\\s-*\\)*\\(\\sw+\\)"

但我无法将它与字体锁定结合使用。

显然

'("implements\\s-+\\(?:\\(\\sw+\\)\\s-*,\\s-*\\)*\\(\\sw+\\)"
  (1 font-lock-type-face) (2 font-lock-type-face))

不起作用,因为它仅突出显示最后一次出现(C 和 D)而忽略第一次反向引用后的星号(*)。

有没有办法捕获所有匹配单词的列表,或者完全不同的方法来解决这个问题?

【问题讨论】:

    标签: regex emacs elisp font-lock


    【解决方案1】:

    如果您不希望逗号也被突出显示,那么您的方法将无法正常工作。当你使用subexp-highlighter的形式

    (subexp facespec)
    

    subexp 指的是您的正则表达式的子组,并使用给定的facespec 突出显示。现在,正则表达式匹配的子组是具有开头和结尾的连续文本范围。事实上,每当您进行正则表达式搜索时,您都可以使用函数(match-beginning subexp)(match-end subexp) 查询这些值。

    但这意味着您不能将可变数量的类名(不包括逗号)与单个子表达式匹配,因为该子表达式必须是连续的跨度。覆盖可变数量的类名的连续跨度也必须始终包含逗号,这是没有办法的。

    这是您的方法不是一个好主意的另一个原因:您的正则表达式明确使用空格。是否将空格从突出显示中排除并不重要,但即使在正则表达式中使用它也不是一个好主意,因为只要允许空格,您也总是会遇到 cmets。

    考虑以下代码行:

    class Foo implements A, /*B, C,*/ D { }
    

    在这种情况下,您可能希望使用font-lock-comment-facefont-lock-type-face 中的周边类突出显示范围/*B, C,*/ 中的字符。如果仅在其他所有内容都已突出显示后突出显示 cmets,您仍然可以实现此效果,并允许 cmets 覆盖其他字体锁定匹配。但这会导致匹配效率相当低,因为每个注释都会首先像代码一样突出显示,然后在第二遍中作为注释突出显示。

    解决这两个问题的方法可能是将关键字(“实现”)和类的匹配划分为两个不同的匹配规则,也许您可​​以使用以下内容作为起点:

    '(("\\bimplements\\b" . font-lock-keyword-face)
      ("\\b[A-Z]\\w*\\b" . font-lock-type-face))
    

    【讨论】:

    • 我没有解决最初的问题,试图检查 cc-mode / java-mode 源,但是添加换行符时该解决方案会中断......所以我想它更像你上面解释的.谢谢!
    【解决方案2】:

    这样的事情似乎在这里工作:

    '("\\(implements\\)\\s-+\\(\\(\\sw+\\s-*,\\s-*\\)*\\sw+\\)"
       (1 font-lock-warning-face)
       (2 font-lock-keyword-face))
    

    (显然你可能想要不同的面孔......)

    【讨论】:

    • 这不是我想要的,因为它突出了逗号(以及单词之间的空格,因为它们是匹配的)。
    • P.S.第一场比赛(实现)是font-lock-keyword-face,其余比赛是font-lock-type-face;)
    猜你喜欢
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 2012-06-10
    • 1970-01-01
    • 2013-11-30
    相关资源
    最近更新 更多