GNU Emacsでは、正規表現(正規表現の構文を参照)の次の一致箇所を、インクリメンタルに、あるいは非インクリメンタルに検索できます。インクリメンタル検索コマンドについては、The GNU Emacs Manualの正規表現検索を参照してください。ここでは、プログラムで有用な検索関数についてのみ説明します。主要なものはre-search-forwardです。
これらの検索機能は、バッファがマルチバイトの場合は正規表現をマルチバイトに変換し、バッファがユニバイトの場合は正規表現をユニバイトに変換します。 テキスト表現を参照してください。
この関数は、現在のバッファ内で、正規表現 regexp に一致する文字列を前方検索します。regexp に一致しないテキストは任意の量だけスキップし、最初に見つかった一致箇所の末尾にポイントを置きます。そして、ポイントの新しい値を返します。
limit が nil
以外の場合、それは現在のバッファ内の位置である必要があります。これは検索の上限を指定します。その位置より先に続く一致は受け付けられません。limit が省略されているか、あるいは nil
である場合は、バッファのアクセス可能な範囲の末尾がデフォルトとなります。
検索に失敗した際に re-search-forward が何を行うかは、noerror の値によって異なります:
nilsearch-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
と類似していますが、単純な鏡像ではありません。re-search-forward
は、開始位置に可能な限り近い位置から始まるマッチを探します。もし re-search-backward
が完全な鏡像であれば、終了位置が可能な限り近いマッチを探すことになります。しかし実際には、開始位置が可能な限り近く(かつ開始位置より前に終わる)マッチを探します。その理由は、特定の箇所で正規表現をマッチさせる処理は常に最初から最後まで行われ、かつ指定された開始位置から始まるためです。
re-search-forwardの完全な鏡像を実現するには、正規表現を末尾から先頭に向かって照合するための特別な機能が必要になります。わざわざ実装する手間をかける価値はありません。
この関数は、string における正規表現 regexp
の最初の一致箇所の開始インデックスを返し、一致がない場合は nil を返します。start が nil 以外の場合、検索は string のそのインデックスから開始されます。
例えば、
(string-match
"quick" "The quick brown fox jumped quickly.")
⇒ 4
(string-match
"quick" "The quick brown fox jumped quickly." 8)
⇒ 27
文字列の1文字目のインデックスは0、2文字目のインデックスは1、といった具合になります。
デフォルトでは、この関数がマッチを見つけた場合、マッチ箇所を超えた最初の文字のインデックスが (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 を返します。
正規表現のマッチングは前方方向にしか機能しないため、ここでは point から後方に向かって、point
で終わるマッチを検索することでこれを実現しています。長い範囲を検索する必要がある場合、かなり時間がかかることがあります。limit に 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コードがユーザーの対話的な入力から生成された正規表現を用いて検索を行う箇所でのみ、一時的にバインドすべきです。言い換えれば、この変数は、正規表現検索のプリミティブに対し、ユーザーが入力した空白文字をどのように解釈すべきかを伝えるためだけに使用すべきです。