Javaの正規表現で真偽値を返すサンプルです。
目次
正規表現で真偽値を返す(完全一致と部分一致の違い)
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-
関連の記事