Next: , Previous: , Up: Searching and Matching   [Contents][Index]


34.4 正規表現の検索

GNU Emacsではインクリメンタルと非インクリメンタルの両方で正規表現(Syntax of Regexpsを参照)にたいする次のマッチを検索できます。インクリメンタル検索コマンドについてはRegular Expression Search in The GNU Emacs Manualを参照してください。ここではプログラム内で有用な検索関数だけを説明します。重要な関数はre-search-forwardです。

これらの検索関数はバッファーがマルチバイトならルチバイト、ユニバイトならユニバイトに正規表現を変換します。Text Representationsを参照してください。

Command: re-search-forward regexp &optional limit noerror count

この関数はカレントバッファー内で、正規表現regexpにマッチするテキスト文字列を前方へ検索する。この関数はregexpにマッチしない任意の量のテキストをスキップして、見つかった最初のマッチの終端にポイントを残す。これはポイントの新たな値をリターンする。

引数limitは検索の境界を指定し、それはカレントバッファー内の位置であること。limitが非nilならカレントバッファー内の位置でなければならない。これは検索の上限位置を指定するその位置を超えるようなマッチは、受け入れられない。limitが省略またはnilの場合のデフォルトは、そのバッファーのアクセス可能範囲の終端である。

検索失敗時にre-search-forwardが何を行うかはnoerrorの値に依存する。

nil

search-failedエラーをシグナルする。

t

何もせずnilをリターンする。

その他

ポイントをlimit (またはバッファーのアクセス可能範囲の終端)に移動してnilをリターンする。

引数noerrorはマッチに失敗した有効な検索だけに影響する。無効な引数はnoerrorとは無関係にエラーとなる。

repeatが正の数nなら検索はn回繰り返される。一連の検索は前回のマッチの終端から毎回検索が開始される。これらの一連の検索が成功すると、関数呼び出しは成功となりポイントを移動して新たな値をリターンする。それ以外は関数の呼び出しは失敗となり、結果は上述のようにnoerrorの値に依存する。repeatが負の数-nなら検索は逆方向(後方)へn回行われる。

以下の例ではポイントは最初は‘T’の前にある。この検索を評価することにより、その行の終端( ‘hat’の‘t’と改行の間)にポイントは移動する。

---------- Buffer: foo ----------
I read "∗The cat in the hat
comes back" twice.
---------- Buffer: foo ----------

(re-search-forward "[a-z]+" nil t 5)
     ⇒ 27

---------- Buffer: foo ----------
I read "The cat in the hat∗
comes back" twice.
---------- Buffer: foo ----------
Command: re-search-backward regexp &optional limit noerror count

この関数はカレントバッファー内で正規表現regexpにマッチするテキスト文字列を後方へ検索して、見つかった最初のマッチの先頭にポイントを残す。

この関数はre-search-forwardと似ているが単なるミラーイメージ(mirror-image: 鏡像)ではない。re-search-forwardは先頭が開始ポイントと可能な限り近いマッチを探す。re-search-backwardが完全なミラーイメージなら終端が可能な限り近いマッチを探すだろう。しかし実際には先頭が可能な限り近い(かつ開始ポイントの前で終わる)マッチを探す。これは与えられた位置にたいする正規表現マッチングが常に正規表現の先頭から終端に機能して、指定された開始位置から開始されることが理由。

re-search-forwardの真のミラーイメージには、正規表現を終端から先頭へマッチする特別な機能が要求されるだろう。それを実装することによる問題と比較して、値する価値はない。

Function: string-match regexp string &optional start

この関数はstring内で正規表現regexpにたいする最初のマッチの開始位置のインデックスをリターンする。string内のそのインデックスから検索が開始される。

たとえば、

(string-match
 "quick" "The quick brown fox jumped quickly.")
     ⇒ 4
(string-match
 "quick" "The quick brown fox jumped quickly." 8)
     ⇒ 27

文字列の最初の文字のインデックスは1、2文字目は2、...となる。

この関数がマッチを見つけたら、そのマッチの先の最初の文字のインデックスは(match-end 0)で利用できる。Match Dataを参照のこと。

(string-match
 "quick" "The quick brown fox jumped quickly." 8)
     ⇒ 27

(match-end 0)
     ⇒ 32
Function: string-match-p regexp string &optional start

この述語関数はstring-matchと同じことを行うが、マッチデータの変更を避ける。

Function: looking-at regexp

この関数はカレントバッファー内のポイント直後のテキストが正規表現regexpにマッチするかどうかを判断する。“直後”の正確な意味は、その検索が“固定”されていて、ポイントの後の最初の文字からマッチが開始する場合のみ成功するということ。成功なら結果はt、それ以外はnil

この関数はポイントを移動しないがマッチデータは更新する。Match Dataを参照のこと。マッチデータを変更せずにテストする必要があるなら、以下で説明するlooking-at-pを使用すること。

以下の例ではポイントは‘T’の直前にある。それ以外の場所にあれば結果はnilになるだろう。

---------- Buffer: foo ----------
I read "∗The cat in the hat
comes back" twice.
---------- Buffer: foo ----------

(looking-at "The cat in the hat$")
     ⇒ t
Function: looking-back regexp limit &optional greedy

この関数はポイントの直前の(ポイントで終わる)テキストがregexpとマッチしたらt、それ以外はnilをリターンする。

正規表現マッチングは前方だけに機能するので、ポイントで終わるマッチをポイントから後方へ検索するように実装された。長い距離を検索する必要がある場合には、これは極めて低速になり得る。非nil値をlimitを指定してその前を検索しないよう告げることにより、検索に要する時間を制限できる。この場合には、マッチデータはlimitかその後で始まらなければならない。以下は例:

---------- Buffer: foo ----------
I read "∗The cat in the hat
comes back" twice.
---------- Buffer: foo ----------

(looking-back "read \"" 3)
     ⇒ t
(looking-back "read \"" 4)
     ⇒ nil

greedyが非nilなら、この関数は可能な限り後方へマッチを拡張して、前方の1文字がregexpがマッチの一部とならなければ停止する。マッチが拡張されたときには、マッチ開始位置がlimitの前にあっても許される。

一般的にlooking-backは低速なので、可能な限り使用を避けることを推奨する。この理由によりlooking-back-pの追加は計画されていない。

Function: looking-at-p regexp

この述語関数はlooking-atと同様に機能するがマッチデータを更新しない。

Variable: search-spaces-regexp

この変数が非nilなら、それは空白文字を検索する方法を告げる正規表現であること。この場合には検索される正規表現内のすべてのスペース属は、この正規表現を使用することを意味する。しかし‘[…]’、‘*’‘+’、‘?’のような構文要素内のスペースはsearch-spaces-regexpの影響を受けない。

この変数はすべての正規表現検索とマッチ構文要素に影響するので、コードの可能な限り狭い範囲にたいして一時的にバインドすること。


Next: , Previous: , Up: Searching and Matching   [Contents][Index]