0

C ++で演算子を見つけて強調表示する正規表現がありますが、正規表現を使用して一致させる方法を見つけることはできませんoperator[]。文字をエスケープする通常のトリックはうまくいかないようです。マッチングを終了するだけです。

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

エスケープされたシンボルを使用してマッチの最後に移動する 2 回目の (不完全な) 試み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

リテラル文字列の正規表現の文字をエスケープするには、2 つの連続したバックスラッシュが必要です。

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

単一のバックスラッシュは、文字列リテラルを解析するときに Emacs Lisp リーダーによって解釈され\n、改行文字などのエスケープ シーケンスを示します。この場合のようにバックスラッシュが既知のエスケープ シーケンスを開始しない場合 (\[は特殊文字ではありません)、バックスラッシュは単純に削除されます。この場合、単一[の文字列が結果の文字列になり、無効な正規表現が作成され、一致が妨げられます。

于 2014-08-07T16:40:46.873 に答える