GNU Emacsではインクリメンタルと非インクリメンタルの両方で正規表現(正規表現の構文を参照)にたいする次のマッチを検索できます。インクリメンタル検索コマンドについてはRegular Expression Search in The GNU Emacs
Manualを参照してください。ここではプログラム内で有用な検索関数だけを説明します。重要な関数はre-search-forward
です。
これらの検索関数はバッファーがマルチバイトならルチバイト、ユニバイトならユニバイトに正規表現を変換します。テキストの表現方法を参照してください。
この関数はカレントバッファー内で、正規表現regexpにマッチするテキスト文字列を前方へ検索する。この関数はregexpにマッチしない任意の量のテキストをスキップして、見つかった最初のマッチの終端にポイントを残す。これはポイントの新たな値をリターンする。
引数limitは検索の境界を指定し、それはカレントバッファー内の位置であること。limitが非nil
ならカレントバッファー内の位置でなければならない。これは検索の上限位置を指定するその位置を超えるようなマッチは、受け入れられない。limitが省略またはnil
の場合のデフォルトは、そのバッファーのアクセス可能範囲の終端である。
検索失敗時にre-search-forward
が何を行うかはnoerrorの値に依存する。
nil
search-failed
エラーをシグナルする。
t
何もせずnil
をリターンする。
ポイントをlimit (またはバッファーのアクセス可能範囲の終端)に移動してnil
をリターンする。
引数noerrorはマッチに失敗した有効な検索だけに影響する。無効な引数はnoerrorとは無関係にエラーとなる。
countが正の数nなら、それは繰り返し回数の役目をもつ。検索はn回繰り返され、前回のマッチの終端から毎回検索が開始される。これらの連続する検索が成功した場合、関数は成功となりポイントを移動して新たな値をリターンする。それ以外は検索失敗となり、上述したように結果はnoerrorの値に依存する。countが負の数 −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 ----------
この関数はカレントバッファー内で正規表現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)
で利用できる。マッチデータを参照のこと。inhibit-modifyが非nil
なら、マッチデータを変更しない。
(string-match "quick" "The quick brown fox jumped quickly." 8) ⇒ 27
(match-end 0) ⇒ 32
この述語関数はstring-match
と同じことを行うが、マッチデータの変更を避ける。
この関数はカレントバッファー内のポイント直後のテキストが正規表現regexpにマッチするかどうかを判断する。“直後”の正確な意味は、その検索が“固定”されていて、ポイントの後の最初の文字からマッチが開始する場合のみ成功するということ。成功なら結果はt
、それ以外はnil
。
この関数はポイントを移動しないが、inhibit-modifyがnil
か省略(デフォルト)ならマッチデータは更新する。マッチデータを参照のこと。利便性のために、inhibit-modify引数のかわりに、下記の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
をリターンする。
正規表現マッチングは前方だけに機能するので、ポイントで終わるマッチをポイントから後方へ検索するように実装された。長い距離を検索する必要がある場合には、これは極めて低速になり得る。非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
の影響を受けない。
この変数は検索とマッチの構文におけるすべての正規表現に効果を及ぼすので、可能なかぎり小さいコード範囲で一時的にバインドすること。そしてこのバインディングによって効果を得るLispコード範囲を、インタラクティブなユーザー入力によって生成されたregexpで検索を行う部分のみに限定すること。言い換えると、ユーザーが入力した空白文字をどのように解釈するべきかをregexp検索プリミティブに伝える場合のみ使用すること。