Matcherオブジェクトをリセットして位置情報をゼロへ戻す(Matcher.reset)

Matcher クラスの find メソッドを連続して実行した場合、二回目からは前回マッチしたした文字列の次の文字から検索が開始されます。このように実行するメソッドによっては位置情報が保持されているのですが Matcher クラスの reset メソッドを実行すると Matcher オブジェクトがリセットされて位置情報がゼロに戻されます。ここでは Java の正規表現で Matcher オブジェクトをリセットして位置情報をゼロに戻す方法について解説します。

(Last modified: )

位置情報をゼロに戻す

Matcher クラスの find メソッドなどは、連続して実行すると毎回対象の文字列の先頭から検索を行うのではなく、前回マッチした最後の文字の次の文字からマッチするかどうかを検索していきます。

位置情報をゼロに戻す(1)

このように実行するメソッドによっては位置情報が保管されているのですが、 Matcher クラスの reset メソッドを使用すること正規表現エンジンをリセットして位置情報をゼロに戻すことができます。書式は次のとおりです。

public Matcher reset()

戻り値:
この正規表現エンジン

メソッドを実行すると位置情報がゼロの位置に戻ります。あわせて設定されていたリージョンが解除されて対象が文字列全体となります(アンカー境界と透過境界の設定は影響を受けません)。

次のサンプルをみてください。

// java.util.regex.*のインポートが必要です
import java.util.regex.*;

String regex  = "AA|BB|CC";
Pattern p = Pattern.compile(regex);

Matcher m = p.matcher("AA BB CC");
if (m.find()){
  System.out.println(m.group());  // AA
}

if (m.find()){
  System.out.println(m.group());  // BB
}

m.reset();

if (m.find()){
  System.out.println(m.group());  // AA
}

find メソッドを連続で実行していますが、 2 回目が終わったあとに reset メソッドを実行して位置情報をゼロに戻しているため、 3 回目の find メソッドは再び対象の文字列の先頭から検索が行われています。

サンプルコード

それでは簡単なサンプルプログラムを作って試してみます。テキストエディタで次のように記述したあと、 JSample29-1.java という名前で保存します。

import java.util.regex.*;

class JSample29_1{
  public static void main(String[] args){
    String regex  = "AA|BB|CC";
    Pattern p = Pattern.compile(regex);

    Matcher m = p.matcher("AA BB CC");
    if (m.find()){
      System.out.println(m.group());
    }

    if (m.find()){
      System.out.println(m.group());
    }

    m.reset();

    if (m.find()){
      System.out.println(m.group());  // AA
    }
  }
}

コンパイルを行います。

javac -encoding UTF-8 JSample29_1.java

その後で、次のように実行してください。

java JSample29_1

位置情報をゼロに戻す(2)

reset メソッドを実行することで位置情報をゼロに戻すことができました。

-- --

Java の正規表現で Matcher オブジェクトをリセットして位置情報をゼロに戻す方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。