用于C ++运算符的font-lock-add-keywords regex

时间:2014-08-07 16:32:25

标签: regex emacs emacs-faces

我有一个正则表达式,可以找到并突出显示C ++中的运算符,但我不能在我的生活中找出如何使用regexp匹配operator[]。逃避角色的通常技巧似乎不起作用,它只是结束匹配。

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

我的第二次(不完整)尝试使用regexp-builder并将转义的符号移动到比赛的结尾让我获得了开场支撑:

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

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

3 个答案:

答案 0 :(得分:3)

我为此使用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是独立的,因为我为他们使用了不同的面孔。

答案 1 :(得分:2)

要匹配文字],请在开幕[后立即投放:

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

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

答案 2 :(得分:2)

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

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

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