本セクションでは、直近の検索またはマッチ操作が成功した場合に、マッチデータを用いて何がマッチしたかを確認する方法について説明します。
マッチしたテキスト全体について、あるいは正規表現の特定の括弧で囲まれた部分式について問い合わせることができます。以下の関数における count 引数で、どちらを指定するかを決定します。count が 0 の場合は、マッチしたテキスト全体について問い合わせます。count が正の値の場合は、どの部分式を指定するかを指定します。
正規表現の部分式とは、エスケープされた括弧 ‘\(…\)’ でグループ化された式のことであることを思い出してください。count番目の部分式は、正規表現全体の先頭から ‘\(’ の出現回数を数えることで求められます。最初の部分式は1、2番目は2というように番号が振られます。部分式を持つことができるのは正規表現のみです。単純な文字列検索の後では、得られる情報はマッチした全体に関する情報に限られるためです。
検索が成功するたびに、マッチデータが設定されます。したがって、検索直後にマッチデータをクエリし、別の検索を行う可能性のある他の関数を呼び出す前に取得してください。あるいは、別の検索を行う可能性のある関数の呼び出し前後で、マッチデータを保存・復元することもできます(マッチデータの保存と復元を参照)。または、明示的にマッチデータを変更しない関数(例:string-match-p)を使用してください。
検索に失敗した場合、マッチデータが変更されることもあれば、されないこともあります。現在の実装では変更されませんが、将来的には変更される可能性があります。検索に失敗した後のマッチデータの値に依存しないようにしてください。
この関数は、直前の検索またはマッチ操作で一致したテキストを文字列として返します。count が 0 の場合はテキスト全体を、count が正の場合は count 番目の括弧付き部分式に対応する部分のみを返します。
前回の同様の操作が string-match
を含む文字列に対して行われた場合は、引数として同じ文字列を in-string
に渡す必要があります。バッファの検索または照合後は、in-string を省略するか、代わりに nil を渡してください。ただし、match-string
を呼び出す際の現在のバッファが、検索または照合を行った際のものであることを確認してください。この手順に従わない場合、誤った結果を招くことになります。
count が範囲外である場合、または ‘\|’ 代替表現内の部分式が使用されなかった場合、あるいは繰り返しが 0 回であった場合、値は
nil となります。
この関数は match-string
と同様ですが、結果にテキストプロパティが付与されない点が異なります。
直前の正規表現検索でマッチが見つかった場合、この関数はマッチしたテキストまたはその部分式の開始位置を返します。
count が 0 の場合、その値はマッチ全体の開始位置となります。そうでない場合、count は正規表現内の部分式を指定し、関数の値はその部分式のマッチ開始位置となります。
値は、‘\|’
の選択枝内の部分式で使用されなかった場合、または0回繰り返された繰り返しの場合、nil となります。
この関数は match-beginning
と同様ですが、開始位置ではなくマッチの終了位置を返します。
以下に、マッチデータの使用例と、テキスト内での位置を示すコメントを記載します。
(string-match "\\(qu\\)\\(ick\\)"
"The quick fox jumped quickly.")
;0123456789
⇒ 4
(match-string 0 "The quick fox jumped quickly.")
⇒ "quick"
(match-string 1 "The quick fox jumped quickly.")
⇒ "qu"
(match-string 2 "The quick fox jumped quickly.")
⇒ "ick"
(match-beginning 1) ; The beginning of the match ⇒ 4 ; with ‘qu’ is at index 4.
(match-beginning 2) ; The beginning of the match ⇒ 6 ; with ‘ick’ is at index 6.
(match-end 1) ; The end of the match ⇒ 6 ; with ‘qu’ is at index 6. (match-end 2) ; The end of the match ⇒ 9 ; with ‘ick’ is at index 9.
別の例を挙げます。ポイントは最初、行の先頭に位置しています。検索により、ポイントはスペースと単語 ‘in’ の間に移動します。マッチ全体の開始位置はバッファの9文字目(‘T’)であり、最初の部分式のマッチ開始位置は13文字目(‘c’)です。
(list
(re-search-forward "The \\(cat \\)")
(match-beginning 0)
(match-beginning 1))
⇒ (17 9 13)
---------- Buffer: foo ----------
I read "The cat ∗in the hat comes back" twice.
^ ^
9 13
---------- Buffer: foo ----------
(この場合、返されるインデックスはバッファ位置であり、バッファの先頭文字が1としてカウントされます。)