【问题标题】:font-lock-add-keywords regexp for C++ operatorsC++ 运算符的 font-lock-add-keywords 正则表达式
【发布时间】:2014-10-01 00:01:28
【问题描述】:

我有一个正则表达式,可以在 C++ 中查找并突出显示运算符,但我终其一生都无法弄清楚如何使用正则表达式匹配 operator[]。转义字符的常用技巧似乎不起作用,它只是结束匹配。

    (font-lock-add-keywords
     nil '(
       ;; operators
       ("[~^&\|!<>:=,.\\+*/%-]" . font-lock-keyword-face) ))

我的第二次(不完整)尝试使用 regexp-builder 并将转义符号移动到比赛的末尾让我得到了左大括号:

    ("[~^=<>&/.,\[\|\*\+\-]" . font-lock-keyword-face)

但添加 \] 或移动 \[ 会杀死任何匹配。我错过了什么?

【问题讨论】:

    标签: regex emacs emacs-faces


    【解决方案1】:

    我为此使用regexp-opt,因为它更具可读性。相关配置:

    (setq operators-font-lock-spec
          (cons (regexp-opt '("+" "-" "*" "/" "%" "!"
                              "&" "^" "~" "|"
                              "=" "<" ">"
                              "." "," ";" ":" "?"))
                (list
                 0 ;; use whole match
                 'font-lock-builtin-face
                 'keep ;; OVERRIDE
                 )))
    
    (setq brackets-font-lock-spec
          (cons (regexp-opt '("(" ")" "[" "]" "{" "}"))
                (list
                 0 ;; use whole match
                 'font-lock-bracket-face
                 'keep ;; OVERRIDE
                 )))
    
    (font-lock-add-keywords
     'c++-mode
     (list
      operators-font-lock-spec
      brackets-font-lock-spec
      (cons c-types-regexp 'font-lock-type-face)))
    

    brackets-font-lock-spec 是分开的,因为我为他们使用了不同的面孔。

    【讨论】:

    • 你可能还想看看rx
    【解决方案2】:

    要匹配文字 ],请将其放在开头 [ 之后:

    "[]~^=<>&/.,\[\|\*\+\-]"
    

    由于空字符选择在正则表达式中没有任何意义,因此该组合被给出了匹配实际] 的替代解释。

    【讨论】:

    • 很好地理解了最初的]——我从来不知道。
    【解决方案3】:

    您需要 两个 连续的反斜杠来转义文字字符串中正则表达式的字符,即

    "[]~^&|!<>:=,.+\\[*/%-]"
    

    在解析字符串文字时,Emacs Lisp 阅读器会解释单个反斜杠,并表示转义序列,例如\n 用于换行符。如果反斜杠没有像本例那样开始已知的转义序列(\[ 不是特殊字符),则简单地删除反斜杠。在这种情况下,单个 [ 会出现在结果字符串中,这会创建一个无效的正则表达式,从而阻止它匹配。

    【讨论】:

    • 建议在@legoscia 的回答中添加第一个],否则当前的正则表达式将不匹配右括号。此外,除非我弄错了,否则您可以取消转义 +,因为它将被视为方括号内的文字。
    • @Dan 谢谢,我相应地更新了我的答案。我并没有真正看表达式的内容,我只是注意到并修复了有缺陷的转义。我应该更仔细地阅读这个问题。
    • 我的部分问题是 re-builder 只显示前 200 个匹配项。删除 \\ ============== 样式的 cmets 让我更进一步,并表明你是正确的。谢谢大家!
    猜你喜欢
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 2012-10-30
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多