次: Entire Match Data, 前: Replacing Match, 上: Match Data
本節では、最後の探索や一致操作において なにに一致したのかを調べるためのマッチデータの使い方を説明します。
一致したテキスト全体や正規表現の括弧で括った特定の部分式に一致した テキストを調べることができます。 以下の関数の引数countでどれかを指定します。 countがゼロであれば、一致全体を調べることになります。 countが正であれば、望みの部分式を指定します。
正規表現の部分式は、エスケープした括弧`\(...\)'でグループ化した 式であることに注意してください。 count番目の部分式は、正規表現全体の先頭から `\('の出現を数えてみつけます。 最初の部分式は1、つぎは2、といった具合です。 部分式は正規表現だけにあります。 単純な文字列探索のあとでは、利用可能な情報は一致全体に関するものだけです。
探索に失敗すると、マッチデータを変更することもしないこともあります。 過去には探索に失敗しても変更しなかったのですが、 将来そうなります。
この関数は、最後の探索や一致操作で一致したテキストを文字列として返す。 countがゼロであるとテキスト全体を返す。 countが正であれば、count番目の括弧で囲んだ部分式に対応する 部分のみを返す。 countが範囲を越えていたり、当該部分式に一致するものがない場合には、 値は
nilである。最後の探索や一致操作を
string-matchで文字列に対して行った場合には、 引数in-stringとして同じ文字列を渡すこと。 バッファの探索や一致のあとでは、in-stringを省略するかnilを渡すこと。 ただし、match-stringを呼び出すときのカレントバッファが 探索を行ったときのバッファであること。
この関数は、最後の正規表現探索やその部分式に一致したテキストの開始位置を返す。
countがゼロであると、値は一致全体の開始位置である。 さもなければ、countは正規表現内の部分式を指定し、 関数の値は当該部分式に一致した部分の開始位置である。
一致に利用されなかった選択肢`\|'内の部分式に対しては、 値は
nilである。
コメントでテキスト内の位置を示しながら マッチデータの利用例を示します。
(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) ; 一致箇所`qu'の先頭は
=> 4 ; 添字4
(match-beginning 2) ; 一致箇所`ick'の先頭は
=> 6 ; 添字6
(match-end 1) ; 一致箇所`qu'の末尾は
=> 6 ; 添字6
(match-end 2) ; 一致箇所`ick'の末尾は
=> 9 ; 添字9
別の例も示します。 ポイントは始めは行頭にあります。 探索によって、ポイントは空白と単語`in'のあいだに移動します。 一致箇所全体の先頭はバッファの9番目の文字(`T')であり、 最初の部分式の一致箇所の先頭は13番目の文字(`c')です。
(list
(re-search-forward "The \\(cat \\)")
(match-beginning 0)
(match-beginning 1))
=> (9 9 13)
---------- Buffer: foo ----------
I read "The cat -!-in the hat comes back" twice.
^ ^
9 13
---------- Buffer: foo ----------
(この例では、返される添字はバッファ内位置であり、 バッファの最初の文字を1と数える。)