Next: POSIX Regexps, Previous: Regular Expressions, Up: Searching and Matching [Contents][Index]
GNU Emacsではインクリメンタルと非インクリメンタルの両方で正規表現(Syntax of Regexpsを参照)にたいする次のマッチを検索できます。インクリメンタル検索コマンドについてはRegular Expression Search in The GNU Emacs
Manualを参照してください。ここではプログラム内で有用な検索関数だけを説明します。重要な関数はre-search-forward
です。
これらの検索関数はバッファーがマルチバイトならルチバイト、ユニバイトならユニバイトに正規表現を変換します。Text Representationsを参照してください。
この関数はカレントバッファー内で、正規表現regexpにマッチするテキスト文字列を前方へ検索する。この関数はregexpにマッチしない任意の量のテキストをスキップして、見つかった最初のマッチの終端にポイントを残す。これはポイントの新たな値をリターンする。
limitが非nil
なら、それはカレントバッファー内の位置であること。これは検索にたいする上限を指定する。その位置を超えるマッチは受け入れられない。
repeatが与えられたなら、それは正の数でなければならない。検索は、その回数繰り返される。それぞれの繰り返しは、前のマッチの終端から開始される。これら一連の検索すべてが成功したらその検索は成功となり、ポイントを移動してポイントの新たな値をリターンする。それ以外では、検索は失敗となる。検索失敗時にre-search-forward
が何をおこなうかは、noerrorの値に依存する:
nil
search-failed
エラーをシグナルする。
t
何もせずnil
をリターンする。
ポイントをlimit (またはバッファーのアクセス可能範囲の終端)に移動してnil
をリターンする。
以下の例ではポイントは最初は‘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 ----------
この関数はカレントバッファー内で正規表現regexpにマッチするテキスト文字列を後方へ検索して、見つかった最初のマッチの先頭にポイントを残す。
この関数はre-search-forward
と似ているが単なるミラーイメージ(mirror-image:
鏡像)ではない。re-search-forward
は先頭が開始ポイントと可能な限り近いマッチを探す。re-search-backward
が完全なミラーイメージなら終端が可能な限り近いマッチを探すだろう。しかし実際には先頭が可能な限り近い(かつ開始ポイントの前で終わる)マッチを探す。これは与えられた位置にたいする正規表現マッチングが常に正規表現の先頭から終端に機能して、指定された開始位置から開始されることが理由。
re-search-forward
の真のミラーイメージには、正規表現を終端から先頭へマッチする特別な機能が要求されるだろう。それを実装することによる問題と比較して、値する価値はない。
この関数は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
この述語関数はstring-match
と同じことを行うが、マッチデータの変更を避ける。
この関数はカレントバッファー内のポイント直後のテキストが正規表現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
この関数はポイントの直前の(ポイントで終わる)テキストがregexpとマッチしたらt
、それ以外は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
の追加は計画されていない。
この述語関数はlooking-at
と同様に機能するがマッチデータを更新しない。
この変数が非nil
なら、それは空白文字を検索する方法を告げる正規表現であること。この場合には検索される正規表現内のすべてのスペース属は、この正規表現を使用することを意味する。しかし‘[…]’、‘*’‘+’、‘?’のような構文要素内のスペースはsearch-spaces-regexp
の影響を受けない。
この変数はすべての正規表現検索とマッチ構文要素に影響するので、コードの可能な限り狭い範囲にたいして一時的にバインドすること。
Next: POSIX Regexps, Previous: Regular Expressions, Up: Searching and Matching [Contents][Index]