ターゲット文字列に繰り返しマッチ

広告

前のページで確認したとおり、ターゲットの文字列にパターンを適用しマッチしているかどうか調べるにはMatcherクラスで定義されているfindメソッドを使います。

例えば次のように記述します。

String str = "Tomato is 100yen, Lemon is 80yen.";
String regex = "¥¥d.+?yen";
Pattern p = Pattern.compile(regex);

Matcher m = p.matcher(str);
if (m.find()){
  System.out.println("マッチしました");
}

findメソッドは最初に呼び出された時にターゲット文字列の最初からマッチするかどうかを見ていきます。よって今回の場合はまず"100yen"にマッチします。

Tomato is 100yen, Lemon is 80yen.

ここでもう一度findメソッドを呼び出してみます。findメソッドは前回の呼び出しが正常に終了した場合、前回のマッチで一致しなかった最初の文字からマッチするかどうかを確認します。つまり"100yen"の次の","の位置です。

Tomato is 100yen, Lemon is 80yen.
                ^この位置

","の位置からパターンにマッチするのは"80yen"です。

Tomato is 100yen, Lemon is 80yen.

ここでもう一度findメソッドを呼び出してみます。今度の場合も同じく前回のマッチで一致しなかった最初の文字からマッチするかどうかを確認します。つまり"80yen"の次の"."の位置です。

Tomato is 100yen, Lemon is 80yen.
                                ^この位置

"."の位置からパターンにマッチするのは存在しないため、findメソッドは失敗します。

このようにfindメソッドを使うことでパターンがターゲット文字列にマッチするかどうか確認することができ、さらにfindに成功した場合には続けて他にマッチするものがないか調べることができます。

findメソッドは成功すると戻り値としてtrueを返しますので、1つのターゲット文字列にマッチする文字列を順に取り出すには次のように記述することができます。

String str = "Tomato is 100yen, Lemon is 80yen.";
String regex = "¥¥d.+?yen";
Pattern p = Pattern.compile(regex);

Matcher m = p.matcher(str);
while(m.find()){
  System.out.println(m.group());
}

※ groupメソッドはマッチした文字列を取得するメソッドです。別のページで解説します。

サンプルプログラム

では実際に試してみます。

JSample6_1.java

import java.util.regex.Pattern;
import java.util.regex.Matcher;

class JSample6_1{
  public static void main(String args[]){
    String str = "Tomato is 100yen, Lemon is 80yen, Banana is 140yen.";

    String regex = "¥¥d.+?yen";
    Pattern p = Pattern.compile(regex);

    System.out.println("Target:" + str);
    System.out.println("Pattern:" + regex + "¥n");

    check(p, str);
  }

  private static void check(Pattern p, String target){
    Matcher m = p.matcher(target);

    while(m.find()){
      System.out.println("match:" + m.group());
    }
  }
}

ではコンパイルを行った上で実行してみます。

p6-1

( Written by Tatsuo Ikura )