1

emacsのメジャーモードの書き方を学ぼうとしています。オンラインにはすばらしいチュートリアルがたくさんありますが (例: http://www.emacswiki.org/emacs/GenericMode )、正規表現マッチングの構文を学ぶのに苦労しています。たとえば、この回答から、理由を理解しようとしています

'(("\"\\(\\(?:.\\|\n\\)*?[^\\]\\)\""

から

(define-derived-mode rich-text-mode text-mode "Rich Text"
  "text mode with string highlighting."

  ;;register keywords
  (setq rich-text-font-lock-keywords
        '(("\"\\(\\(?:.\\|\n\\)*?[^\\]\\)\"" 0 font-lock-string-face)))
  (setq font-lock-defaults rich-text-font-lock-keywords)
  (font-lock-mode 1))

二重引用符の間のすべてに一致します。この資料: http://www.gnu.org/software/emacs/manual/html_node/elisp/Regexp-Special.html#Regexp-Special はそれを説明していないようです。

そこにもっと良いリソースはありますか?

4

1 に答える 1

2

正規表現が何をするかというあなたの質問への答え --- あなたが引用した例の正規表現は実際には"\"\\(\\(?:.\\|\n\\)*?[^\\]\\)\"".

一致する部分は次のとおりです。

  • \"、これは char のみに一致します"--- これは正規表現の最初と最後にあります。

  • \\(?:.\\|\n\\)*?が続くグループ[^\\]。グループはおそらくそこにあるので、一致のその部分、つまり最初と最後font-lock-keywordsの一致の間の部分で何かをするように指示することができます。"

  • \\(?:.\\|\n\\)*?グループの最初の部分である は、0 個以上の文字 --- 任意の文字に一致します。*?ちょうど*(同じこと)かもしれません。は.改行文字以外の任意の文字に\n一致し、 は改行文字に一致します。\\|どちらでもOKという意味です。

  • [^\\]バックスラッシュ ( ) を除く任意の文字に一致します\

まとめると、グループは 0 個以上の文字の後にバックスラッシュではない文字が続くものと一致します。文字間のゼロ以上の文字に一致する正規表現を使用しないのはなぜ"ですか? "おそらく、エンディングが(バックスラッシュによって)エスケープされていないことを確認したかったためです。ただし、正規表現では、文字の間に少なくとも 1 つの文字が必要である"ため、正規表現が空の文字列 と一致しないことに注意してください""

良いリソースはhttp://www.emacswiki.org/emacs/RegularExpressionです。

于 2013-08-31T17:08:37.120 に答える