Next: , Previous: , Up: 正規表現   [Contents][Index]


35.3.4 正規表現の関数

以下の関数は正規表現を扱います。

Function: regexp-quote string

この関数はstringだけに正確にマッチするような正規表現をリターンする。looking-at内でこの正規表現を使用すると、そのバッファー内の次の文字がstringのときだけ成功するだろう。検索関数でのこの正規表現の使用は、検索されるテキストがstringを含むなら成功するだろう。正規表現の検索を参照のこと。

これにより、その正規表現を求める関数呼び出し時に正確な文字列マッチや検索を要求できる。

(regexp-quote "^The cat$")
     ⇒ "\\^The cat\\$"

正規表現として記述されたコンテキストにおいて、正確な文字列マッチを結合することがregexp-quoteの1つの使い方である。たとえば以下は空白文で囲まれたstringの値であるような文字列を検索する:

(re-search-forward
 (concat "\\s-" (regexp-quote string) "\\s-"))

スペシャル文字を何も含まなければ、リターンされる文字列はstring自身となるだろう。

Function: regexp-opt strings &optional paren

この関数はリストstringsの文字列だけにマッチする効果的な正規表現をリターンする。これはマッチングや検索を可能な限り高速にする必要があるとき、たとえばFont Lockモードで有用である27

stringsが空リストなら、リターン値は何にもマッチすることはないregexpとなる。

オプション引数parenには以下のいずれかを指定できる:

文字列

結果となるregexpの前にparen、後に‘\)’が付加される。たとえば‘"\\(?1:"’を使用すると番号付きのグループを明示的に生成する。

words

結果となるregexpは‘\<\(’と‘\)\>’で括られる。

symbols

結果となるregexpは‘\_<\(’と‘\)\_>’で括られる(これはプログラミング言語のキーワードの類のマッチング時にしばしば適している)。

nil

結果となるregexpは‘\(’と‘\)’で括られる。

nil

後に付加する後置演算子が式全体に適用されるために必要なら、結果となるregexpは‘\(?:’と‘\)’で括られる。

リターンされるregexpは可能な最長文字列に常にマッチする方法の順序に整列される。

再整列されるまでregexp-optの結果regexpはその単純化されたバージョンと等価だが、通常はより効果的である。

(defun simplified-regexp-opt (strings &optional paren)
 (let ((parens
        (cond
         ((stringp paren)       (cons paren "\\)"))
         ((eq paren 'words)    '("\\<\\(" . "\\)\\>"))
         ((eq paren 'symbols) '("\\_<\\(" . "\\)\\_>"))
         ((null paren)          '("\\(?:" . "\\)"))
         (t                       '("\\(" . "\\)")))))
   (concat (car parens)
           (mapconcat 'regexp-quote strings "\\|")
           (cdr parens))))
Function: regexp-opt-depth regexp

この関数はregexp内のグループ化された構成要素(カッコで囲まれた正規表現)の総数をリターンする。これには内気なグループは含まれない(正規表現内のバッククラッシュ構文を参照)。

Function: regexp-opt-charset chars

この関数は文字リストchars内の文字にマッチする正規表現をリターンする。

(regexp-opt-charset '(?a ?b ?c ?d ?e))
     ⇒ "[a-e]"
Variable: regexp-unmatchable

この変数はすべての文字列にマッチしないことが保証されたregexpを含む。これは実際に何かとマッチするようにセットされ得る変数用のデフォルト値として特に有用。


Footnotes

(27)

regexp-optの結果が絶対的にもっとも効率的であるという保証はないことに注意してください。手作業でチューニングした正規表現のほうがわずかに効率的なこともありますが、これに努力する価値はほとんどないでしょう。