Java 正規表現で真偽値を返す(matches)

Javaの正規表現で真偽値を返すサンプルです。

目次

サンプル 正規表現で真偽値を返す(完全一致と部分一致の違い)
任意の1文字(.) / 任意の文字が0回以上(.*) / 任意の文字が1回以上(.+)
orを指定([]) / 否定(^) / 文字の範囲(-)
先頭の文字列(^) / 末尾の文字列($)
連続する文字{数値} / 1桁以上{1,}
数値(0-9)の5桁+先頭と末尾も(0-9)
数値(0-9)と英字(a-f)の5桁+先頭と末尾も(0-9 or a-f)
郵便番号(数値3桁とハイフンと数値4桁)+先頭と末尾も(0-9)
ドット(.)を文字として指定(エスケープ)

正規表現で真偽値を返す(完全一致と部分一致の違い)

JavaScript等の他言語と違い完全一致と部分一致でメソッドが異なるので注意が必要です。

正規表現で完全一致を行う場合は、Stringクラスのmatchesメソッド等を使用します。
→文字列全体が一致した時にtrueを返し、一致しない時にfalseを返します。

正規表現で部分一致を行う場合は、PatternクラスとMatcherクラスを使用します。
→文字列の一部が一致した時にtrueを返し、一致しない時にfalseを返します。

サンプル

package test1;

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

public class Test1 {
	public static void main(String[] args) {
		// 完全一致
		String pattern = "A[BC]D";
		System.out.println("ABD".matches(pattern));// true
		
		// 部分一致 文字列の前後に別の文字があるのでfalse
		System.out.println("* ABD *".matches(pattern));// false

		// 部分一致 PatternクラスとMatchrクラスでtrue
		Pattern pattern2 = Pattern.compile("A[BC]D");
		Matcher matcher = pattern2.matcher("* ABD *");
		System.out.println(matcher.find()); // true
	}
}

9行目の[BD]の角括弧は、ORを表し「A」と、「B」または「C」と「D」の意味です。
10行目は、完全一致のためtrueを返します。
13行目は、ABDの前後に別の文字があるので不一致でfalseを返します。
18行目は、ABDの前後に別の文字がありますが部分一致するのでtrueを返します。

任意の1文字(.)

    String pattern = ".BC";
    	
    System.out.println("ABC".matches(pattern));//true
    System.out.println("ACB".matches(pattern));//false

ピリオド(.)は、任意の1文字を表します。

任意の文字が0回以上(.*)

	String pattern = "A.*D";

	System.out.println("ABCD".matches(pattern));// true
	System.out.println("ABD".matches(pattern));// true
	System.out.println("AD".matches(pattern));// true

ドット(.)は任意の文字でアスタリスク(*)は直前の文字が0回以上の繰り返しを表します。

任意の文字が1回以上(.+)

	String pattern = "A.+D";

	System.out.println("ABCD".matches(pattern));// true
	System.out.println("ABD".matches(pattern));// true
	System.out.println("AD".matches(pattern));// false

ドット(.)は任意の文字でプラス(+)は直前の文字が1回以上の繰り返しを表します。

orを指定([])

	String pattern = "A[BC]";

	System.out.println("AB".matches(pattern));// true
	System.out.println("AC".matches(pattern));// true
	System.out.println("ABC".matches(pattern));// false

「A」と、「B」または「C」を指定しています。

否定(^)

    String pattern = "ZZ[^AB]";
    	
    System.out.println("ZZZ".matches(pattern));//true
    System.out.println("ZZA".matches(pattern));//false
    System.out.println("ZZB".matches(pattern));//false

文字列の3文字目が「A」と「B」以外を指定しています。
先頭の文字列で検索する正規表現と似ていますが、こちらは角かっこ([])があります。

文字の範囲(-)

    String a = "A[A-C]C";
    	
    System.out.println("ABC".matches(a));//true
    System.out.println("AZC".matches(a));//false

文字列の2文字目が「A」または「B」または「C」の文字を指定しています。

先頭の文字列(^)

    String a = "^AB.";
    
    System.out.println("ABC".matches(a));//true
    System.out.println("AZC".matches(a));//false

先頭が「AB」の文字を指定しています。
文字を否定で検索する正規表現と似ていますが、こちらは角かっこ([])がありません。
ピリオド(.)は、任意の1文字を表します。

末尾の文字列($)

    String a = ".BC$";
    	
    System.out.println("ABC".matches(a));//true
    System.out.println("AZC".matches(a));//false

末尾が「BC」の文字を指定しています。ピリオド(.)は、任意の1文字を表します。

連続する文字{数値}

   String a = "ac{2}b";
    	
    System.out.println("accb".matches(a));//true
    System.out.println("acccb".matches(a));//false
    System.out.println("acb".matches(a));//false

「c」が2回連続する文字を指定しています。

1桁以上{1,}

    String ptr = "[0-9]{1,}-";
 // String ptr = "\\d{1,}-";
    	
    System.out.println("1-".matches(ptr)); //true
    System.out.println("123-".matches(ptr)); //true
    System.out.println("ab1-".matches(ptr)); //false
    System.out.println("a1b-".matches(ptr)); //false

1行目は、数値1桁以上とハイフン(-)を指定しています。
2行目も数値1桁以上を意味します。エスケープとエスケープのエスケープとしてバックスラッシュ(ユニコードのU+005C)つけます。環境によっては円マークで表示されます。

数値(0-9)の5桁+先頭と末尾も(0-9)

    String a = "^[0-9]{5}$";
    	
    System.out.println("12345".matches(a));//true
    System.out.println("123".matches(a));//false 桁数不足
    System.out.println("123a5".matches(a));//false 文字あり

 

数値(0-9)と英字(a-f)の5桁+先頭と末尾も(0-9 or a-f)

    String a = "^[0-9a-f]{5}$";
    	
    System.out.println("123ab".matches(a));//true
    System.out.println("123a".matches(a));//false 桁数不足
    System.out.println("abcde".matches(a));//true 英字のみ
    System.out.println("12345".matches(a));//true 数値のみ

 

郵便番号(数値3桁とハイフンと数値4桁)+先頭と末尾も(0-9)

    String a = "^[0-9]{3}-[0-9]{4}$";
//  String a = "^\\d{3}-\\d{4}$";
    	
    System.out.println("123-4567".matches(a));//true
    System.out.println("1234567".matches(a));//false
    System.out.println("1234-567".matches(a));//false

1,2行目は、同じ意味です。エスケープとエスケープのエスケープとしてバックスラッシュ(ユニコードのU+005C)つけます。環境によっては円マークで表示されます。

ドット(.)を文字として指定(エスケープ)

    String a = "a\\.";
    	
    System.out.println("a.".matches(a));//true
    System.out.println("aa".matches(a));//false

1行目は、ドット(.)を文字として扱います。「a.」を指定しています。
エスケープとエスケープのエスケープとしてバックスラッシュ(ユニコードのU+005C)をつけます。環境によっては円マークで表示されます。
ドット(.)にエスケープをつけない場合は任意の一文字という意味になります。

以下はJava8 API仕様のmatchesメソッドのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/String.html#matches-java.lang.String-

関連の記事

Java split 文字列を分割して配列にする
Java replace 文字列を置換するサンプル

△上に戻る