パターンの作成

広告

正規表現を利用する上でまず行うことはパターンを作成することです。パターンとは何にマッチさせるのかを定義したものと考えて下さい。

例えば"2009"という4文字が含まれているかどうか調べたい場合もありますし、"color"という5文字が先頭から現れるかどうか調べたい場合もあります。この調べたい条件を文字列として表します。

String regex = "abc";

上記の場合は"abc"という3つの文字が連続して現れるかどうかを調べるパターンを表す文字列です。この場合は例えば次のようなターゲット文字列とマッチします。

abc
abcdef
xxxabczzz
123abc

またパターンでは特殊な意味を持つ文字と組み合わせることもできます。

String regex = "^abc";

上記の場合は"abc"という3つの文字がターゲット文字列の先頭から現れるかどうかを調べるパターンを表す文字列です。例えば次のような文字列とマッチします。

abc
abcdef

java.util.regex.Patternクラス

パターンを表す文字列を定義したら、次にパターンオブジェクトを作成します。パターンオブジェクトは文字列として記述されたパターンをJavaがプログラムの中で使用できる形式に変換したものと考えて下さい。

パターンはjava.util.regex.Patternクラスで定義されています。このクラスはコンストラクタは用意されておらず、次のstaticメソッドを使って作成します。

指定された正規表現をパターンにコンパイルします。

パラメータ:
  regex - コンパイルされる表現 
例外:
  PatternSyntaxException - 表現の構文が無効である場合

引数にはパターンを表す文字列を指定して下さい。

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

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

またパターンオブジェクトを作成する時にはオプションを指定することができます。

指定されたフラグを使用して、指定された正規表現をパターンにコンパイルします。

パラメータ:
  regex - コンパイルされる表現
  flags - マッチフラグ。CASE_INSENSITIVE、MULTILINE、DOTALL、UNICODE_CASE、CANON_EQ、
    UNIX_LINES、LITERAL、および COMMENTS を含めることのできるビットマスク
例外:
  IllegalArgumentException - 定義済みマッチフラグに対応するビット値以外の値が flags に設
    定されている場合 
  PatternSyntaxException - 表現の構文が無効である場合

1番目の引数には条件を記述した文字列を指定して下さい。そして2番目の引数にオプションのフラグを設定します。例えば「CASE_INSENSITIVE」を指定すると大文字と小文字を区別しなくなります。このオプションの使い方は別のページで詳しく確認します。

パターンを作成したら、次の手順はパターンとターゲット文字列を指定してマッチャを作成します。これは次のページで解説します。

サンプルプログラム

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

JSample2_1.java

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

class JSample2_1{
  public static void main(String args[]){
    String str1 = "abcdef";
    String str2 = "defabc";

    String regex1 = "abc";
    Pattern p1 = Pattern.compile(regex1);

    String regex2 = "^abc";
    Pattern p2 = Pattern.compile(regex2);

    check(p1, str1);
    check(p1, str2);
    check(p2, str1);
    check(p2, str2);
  }

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

    System.out.print(target + " は " + p.pattern() + " に");

    if (m.find()){
      System.out.println("マッチします");
    }else{
      System.out.println("マッチしません");
    }
  }
}

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

p2-1

今回は2つのパターンを作成し、それぞれ2つのターゲット文字列に対してマッチするかどうかを試しました。

なお上記のサンプルではパターンオブジェクトから元になっている条件式を表す文字列をPatternクラスで定義されているpatternメソッドを使って取得しています。

このパターンのコンパイル元の正規表現を返します。

戻り値:
  このパターンのコンパイル元

メソッドを実行するとcompileメソッドの引数に指定した文字列を取得できます。

( Written by Tatsuo Ikura )