0

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

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

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

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

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

4

3 回答 3

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

于 2014-08-07T20:20:38.987 回答
2

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

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

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

于 2014-08-07T16:40:27.003 回答
2

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

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

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

于 2014-08-07T16:40:46.873 回答