我有一个正则表达式,可以找到并突出显示C ++中的运算符,但我不能在我的生活中找出如何使用regexp匹配operator[]
。逃避角色的通常技巧似乎不起作用,它只是结束匹配。
(font-lock-add-keywords
nil '(
;; operators
("[~^&\|!<>:=,.\\+*/%-]" . font-lock-keyword-face) ))
我的第二次(不完整)尝试使用regexp-builder
并将转义的符号移动到比赛的结尾让我获得了开场支撑:
("[~^=<>&/.,\[\|\*\+\-]" . font-lock-keyword-face)
但添加\]
或移动\[
会导致任何匹配。我错过了什么?
答案 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
表示换行符。如果反斜杠没有启动已知的转义序列,如本例所示(\[
不是特殊字符),则只删除反斜杠。在这种情况下,单个[
最终会出现在结果字符串中,这会创建一个无效的正则表达式,从而阻止它匹配。