[Java] 正規表現によるパターンマッチング | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

よく使うわりに、よく使い方を忘れるのでメモしておきます。


正規表現によるパターンマッチングを行うには、java.util.regex パッケージの Pattern クラスと Matcher クラスを利用します。

Pattern クラスは正規表現パターンを表すクラス、Matcher クラスはマッチングを行うクラスで、それぞれ、以下のように準備します。

String value = "This is a pen.";
String pattern = "\\w+";
Pattern p = Pattern.compile(value);
Matcher m = p.matcher(pattern);

最終的に使用したいのは Matcher クラスなので、以下のようにしてもいいかもしれません。

Matcher m = Pattern.compile(pattern).matcher(value);


Matcher クラスが準備できたら、マッチングを実行します。

マッチングには matches() または find() を使います。


matches()

matches() は文字列全体がパターンに完全にマッチするかどうかを返します。


以下の例では、パターンに完全にマッチするため、matches() は true を返します。

String value = "This is a pen.";
String pattern = "This is a \\w+.";
Matcher m = Pattern.compile(pattern).matcher(value);
if (m.matches()){
    System.out.println("\"" + pattern + "\" matches \"" + value + "\".");
} else {
    System.out.println("\"" + pattern + "\" does not match \"" + value + "\".");
}

以下の例では、パターンに部分的にしかマッチしないため、matches() は false を返します。

String value = "This is a pen.";
String pattern = "\\w+";
Matcher m = Pattern.compile(pattern).matcher(value);
if (m.matches()){
    System.out.println("\"" + pattern + "\" matches \"" + value + "\".");
} else {
    System.out.println("\"" + pattern + "\" does not match \"" + value + "\".");
}


find()

find() は文字列を前から検索し、パターンにマッチする部分文字列があるかどうかを返します。


以下の例では、find() は true を返します。

String value = "This is a pencil.";
String pattern = "pen";
Matcher m = Pattern.compile(pattern).matcher(value);
if (m.find()){
    System.out.println("\"" + pattern + "\" is found in \"" + value + "\".");
} else {
    System.out.println("\"" + pattern + "\" is not found in \"" + value + "\".");
}

以下の例では、find() は false を返します。

String value = "This is a pencil.";
String pattern = "\\bpen\\b";
Matcher m = Pattern.compile(pattern).matcher(value);
if (m.find()){
    System.out.println("\"" + pattern + "\" is found in \"" + value + "\".");
} else {
    System.out.println("\"" + pattern + "\" is not found in \"" + value + "\".");
}

find() の場合は、文字列の中にパターンにマッチする部分文字列が複数存在する場合に、繰り返し実行することで前方から順にそれらの部分文字列を順次抽出することができます。


group()

matches() または find() の実行後、マッチした部分文字列を抽出するには、group() を実行します。


以下の例では、"This"、"is"、"a"、"pen" が抽出されます。

String value = "This is a pen.";
String pattern = "(\\w+)";
Matcher m = Pattern.compile(pattern).matcher(value);
while (m.find()){
    System.out.println(m.group());
}

また、group(int group) を使用すれば、後方参照を利用して、"()" でグループ化された各部分文字列を抽出することができます。


以下の例では、年、月、日が別々に抽出されます。

String value = "2009/12/31";
String pattern = "(\\d{4})/(\\d{2})/(\\d{2})";
Matcher m = Pattern.compile(pattern).matcher(value);
if (m.matches()){
    System.out.println(m.group(1)+ "年" + m.group(2) + "月" + m.group(3) + "日");
}