マッチャを作成しターゲット文字列にマッチさせる

広告

パターンオブジェクトを作成したら、次はターゲットとなる文字列を対象にしてマッチするかどうかを調べます。この時に使用するのがマッチャです。マッチャはパターンを使ってターゲットの文字列に対して様々な操作を行うオブジェクトです。

マッチャはjava.util.regex.Matcherクラスで定義されています。このクラスはコンストラクタは用意されておらず、Patternクラスで定義されているmatcherを使って作成します。

指定された入力とこのパターンをマッチする正規表現エンジンを作成します。

パラメータ:
  input - マッチされる文字シーケンス 
戻り値:
  このパターンの新しい正規表現エンジン

引数にはターゲットとなる文字列を、CharSequenceインターフェースを実装したクラスのオブジェクトを指定して下さい。Stringクラスなどが該当します。

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

String str = "abcdef";
String regex = "abc";
Pattern p = Pattern.compile(regex);

Matcher m = p.matcher(str);

この場合、"abc"で表されるパターンとターゲットの文字列である"abcdef"を対象としたマッチャが作成されます。

java.util.regex.Matcherクラス

マッチャが作成されたら、マッチャに対して様々な操作を指示できます。

例えば、ターゲットの文字列にパターンを適用しマッチしているかどうか調べるにはMatcherクラスで定義されているfindメソッドを使います。

入力シーケンスからこのパターンとマッチする次の部分シーケンスを検索します。

このメソッドは、正規検索エンジンの領域の先頭から開始されます。 ただし、前回の呼び出しが正
常に終了してから正規表現エンジンがリセットされていない場合は、前回のマッチで一致しなかった
最初の文字から開始されます。

マッチが成功した場合は、start、end、および group メソッドを使用して詳細情報を取得できます。

戻り値:
  入力シーケンスの部分シーケンスがこの正規表現エンジンのパターンとマッチした場合にのみ
    true

作成したマッチャオブジェクトに対してこのメソッドを実行すると、ターゲット文字列がパターンにマッチしているかどうか調べ結果をboolean型の値で返します。

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

String str = "abcdef";
String regex = "abc";
Pattern p = Pattern.compile(regex);

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

他にも数多くのメソッドが用意されており、ターゲット文字列のどの位置からマッチしたかどうか、実際にマッチした文字列はどの部分なのかなどをマッチャを通して取得することができます。

サンプルプログラム

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

JSample3_1.java

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

class JSample3_1{
  public static void main(String args[]){
    String str1 = "stat[01]end";
    String str2 = "array[int]";

    String regex = "¥¥[.*¥¥]";
    Pattern p = Pattern.compile(regex);

    check(p, str1);
    check(p, str2);
  }

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

    if (m.find()){
      System.out.println("マッチします");
      System.out.println("マッチした部分は " + m.group() + " です");
    }else{
      System.out.println("マッチしません");
    }
  }
}

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

p3-1

今回は"["で始まり"]"で終わる文字列があるかどうかのパターンを作成しマッチするかどうか調べています。またマッチした場合は、ターゲット文字列の中で実際にマッチした部分を表示しています。

( Written by Tatsuo Ikura )