Java 入門

ホーム > Java の正規表現 (Regular Expression) > Java の正規表現 (Regular Expression) の基礎

Java の正規表現 (Regular Expression) の基礎

まずは、正規表現自体を知らないという方のために簡単に正規表現について説明しましょう。

正規表現は通常「文字のパターンマッチング」という意味で使われています。

正規表現を使えば、例えば

「この文字列から数字の部分だけ抜き出したい」

とか

「このテキストファイルに含まれているメールアドレスだけ抜き出したい」

とか

「ユーザーが入力した文字が正しい URL の形式になっているかチェックしたい」

といった要望を満たすことができます。

「メールアドレスを抜き出したい」というときには、"メールアドレス" とはそもそもどんな文字列か? ということを定義します。

「メールアドレスなら、最初にアルファベットか数字が続いて、次に @ マークが来て、次にまたアルファベットか数字、または . が続く」

と考えたとします。(厳密に言えばもうちょっと細かくチェックしないとダメですけどね)

このとき、こうしたルールのことを「パターン」といいます。

正規表現では、このパターンを特定の文字列に適用して、パターンに合致するかしないかチェックすることができます。

ちなみに、正規表現というのは英語で Regular Expression というので、正規表現には RegExp などの略称とかクラス名がチラホラみえかくれします。

正規表現の簡単な利用例

ではさっそく、正規表現の利用方法をみていきましょう。

次の例は、"ABCDEF" という文字列に、"CD" というパターンがマッチするかみています。

パターンといってもここでは単純に "CD" という固定の文字列ですから、何も正規表現などを使わずにも文字列内を検索すればいいだけですね。 ここはまぁ、最初の例ということで単純にしてます。

コードは次のようになります。

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

public class RegExpTest11 {

	public static void main(String[] args) {
		String s = "ABCDEF";
		String patternString = "CD";
		Pattern p = Pattern.compile(patternString);
		Matcher m = p.matcher(s);
		
		System.out.println(m.matches() ? "O" : "X");
		System.out.println(m.find() ? "O" : "X");
	}

}

実行結果は次の通りです。

X
O

では上の例を説明します。

matches() と find()

パターンは java.util.regex.Pattern で定義します。 Pattern.compile メソッドで、引数として受け取ったパターン文字列を元に、 Pattern オブジェクトを作成します。

ここでは "CD" という単純な文字列を渡していますが、「数字二個」とか「アルファベット二個か三個」といった意味のパターンを指定することも可能です。 (具体的な指定方法は後述)

matcher メソッドで適用する文字列を指定します。

matcher メソッドを呼び出した結果取得できる Matcher オブジェクトを使って実際のパターンマッチング操作を行います。

matches() メソッドは、パターンを適用する文字列全体がパターン文字列と合致するかどうかチェックします。

ここでは "ABCDEF" という文字全体が "CD" と合致するか、ということで、これは明らかに false となります。

find() メソッドはパターンを適用する文字列の中に指定したパターンが存在するかどうかチェックします。

ここでは "ABCDEF" という文字列の中に "CD" が存在するかどうか、ということになるので true が返ります。

文字クラス

正規表現では文字クラスといって、複数の文字をまとめて表現することができます。

例えば、「0, 1, 2, 3, ... , 9 のどれか」ということについては [0123456789] と書けます。

またこれは「0 から 9 のどれか」ということで [0-9] と書けます。

これを用いると「0 から 9 のどれかがひとつ以上」というパターンは [0-9]+ と書けます (+ はひとつ以上、* はゼロ以上を表します)。

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


public class RegExpTest13 {

	public static void main(String[] args) {
		String s = "AB123EF";
		String patternString = "[0-9]+";
		Pattern p = Pattern.compile(patternString);
		Matcher m = p.matcher(s);
		
		System.out.println(m.find() ? "O" : "X");
	}

}

「0 から 9」ということはすなわち「数字」ということで、特別な文字でパターンが表現できます。

[0-9] は \d と書いても同じです。

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


public class RegExpTest14 {

	public static void main(String[] args) {
		String s = "AB123EF";
		String patternString = "\\d+";
		Pattern p = Pattern.compile(patternString);
		Matcher m = p.matcher(s);
		
		System.out.println(m.find() ? "O" : "X");
	}

}

文字列の中では \ はエスケープするために \\ と二つ組み合わされています。

また「数字」クラスには特別な名前が付いていて {Digit} とも書けます。 これは事前定義の文字クラス名 (predefined character class name) といいます。

パターン文字列中で事前定義の文字クラス名を表すためには、\p を用いますから、上記のコードを書き直すと次のようになります。

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


public class RegExpTest12 {

	public static void main(String[] args) {
		String s = "AB123EF";
		String patternString = "\\p{Digit}+";
		Pattern p = Pattern.compile(patternString);
		Matcher m = p.matcher(s);
		
		System.out.println(m.matches() ? "O" : "X");
		System.out.println(m.find() ? "O" : "X");
	}

}

他の事前定義文字クラスは Perl 方式とほぼ同様なので、既にご存知の方も多いかもしれませんね。

大文字小文字の区別

基本的にパターン文字列は大文字と小文字を区別します。これをケースセンシティブであるといいます。

大文字小文字を区別しない場合は compile メソッドに Pattern.CASE_INSENSITIVE フラグを渡して次のようにします。

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

public class RegExpTest4 {

	public static void main(String[] args) {
		String s = "abcdefg";
		String patternString = "CDE";
		
		Pattern p = Pattern.compile(
			patternString, Pattern.CASE_INSENSITIVE
		);
		Matcher m = p.matcher(s);
		
		System.out.println(
			m.find() ? "Match" : "Not Match"
		);
	}

}

ここでは正規表現の基本的なメソッド、使用方法について説明しました。

ホーム > Java の正規表現 (Regular Expression) > Java の正規表現 (Regular Expression) の基礎