Next: , Previous: , Up: Match Data   [Contents][Index]


34.6.2 単純なマッチデータへのアクセス

このセクションでは最後の検索やマッチング操作で、それが成功した場合に何がマッチされたのかを調べるために、マッチデータを使用する方法について説明します。

マッチしたテキスト全体または正規表現のカッコで括られた特定の部分式にたいして問い合わせることができます。以下の関数では、countによりどの部分式かを指定できます。countが0ならマッチ全体、countが正なら望む部分式を指定します。

正規表現での部分式とは、エスケープされたカッコ‘\(…\)’でグループ化された表現だったことを思い出してください。count番目の部分式は正規表現全体の先頭から‘\(’を数えることで見つけられます。最初の部分式が1、2つ目が2、...となります。正規表現だけが部分式をもつことができ、単純な文字列検索の後で利用できるのはマッチ全体の情報だけです。

成功したすべての検索はマッチデータをセットします。したがって検索後は別の検索を行うかもしれない関数を呼び出す前に、検索の直後にマッチデータを問い合わせるべきです。別の検索を呼び出すかもしれない関数の前後で、かわりにマッチデータの保存とリストアすることもできます(Saving Match Dataを参照)。またはstring-match-pのようなマッチデータを変更しないと明示されている関数を使用してください。

検索が成功しようと失敗しようとマッチデータは変更されます。現在はこのように実装されていますが、これは将来変更されるかもしれません。失敗した後のマッチデータを信用しないでください。

Function: match-string count &optional in-string

この関数は最後の検索やマッチ処理でマッチしたテキストを文字列としてリターンする。これはcountが0ならテキスト全体、countが正ならcount番目のカッコで括られた部分式に対応する部分だけをリターンする。

そのような最後の処理が文字列にたいするstring-match呼び出しなら、引数in-stringには同じ文字列を渡すこと。バッファーの検索やマッチの後は、in-stringを省略するかnilを渡すこと。しかし最後に検索やマッチを行ったバッファーが、match-string呼び出し時にカレントバッファーであることを確認すること。このアドバイスにしたがわなければ誤った結果となるだろう。

countが範囲外、‘\|’選択肢内部の部分式が使用されない、または0回の繰り返しなら値はnil

Function: match-string-no-properties count &optional in-string

この関数はmatch-stringと似ているが結果がテキストプロパティをもたない点が異なる。

Function: match-beginning count

最後の正規表現検索がマッチを見つけたら、この関数はマッチしたテキストか部分式の開始位置をリターンする。

countが0なら値はマッチ全体の開始位置。それ以外ならcountは正規表現内の部分式を指定するので、この関数の値はその部分式にたいするマッチの開始位置。

使用されない、あるいは0回の繰り返しであるような‘\|’選択肢内部の部分式にたいしての値はnil

Function: match-end count

この関数は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)       ; qu’にたいするマッチ先頭の
     ⇒ 4                 ;   インデックスは4

(match-beginning 2)       ; ick’にたいするマッチ先頭の
     ⇒ 6                 ;   インデックスは6

(match-end 1)             ; qu’にたいするマッチ終端の
     ⇒ 6                 ;   インデックスは6

(match-end 2)             ; ick’にたいするマッチ終端の
     ⇒ 9                 ;   インデックスは9

別の例を以下に示します。ポイントは最初は行の先頭にあります。検索の後はポイントはスペースと単語‘in’の間にあります。マッチ全体の先頭はバッファーの9つ目の文字‘T’、1つ目の部分式にたいするマッチの先頭は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つ目の文字を1と数える。)