matches()と正規表現の書き方が少しわかるJavaの例文 | Java超初心者の勉強

Javaで正規表現を扱えるAPI  java.util.regex パッケージがあります。その中にあるboolean matches() メソッドの使い方と正規表現を少し学べる内容です。似たようなfind()メソッドも存在しますが、ここでは触れません。ひたすら matches() のサンプルコードです。

正規表現の種類については別でまとめているので、参考にしていただければと思います。

matches() と正規表現のドット「.」を使ったサンプルコード

はじめはドット「.」の使い方がよくわかりませんでしたが羅列するとわかりやすいです。

import java.util.; import java.util.regex.;
public class Main {
public static void main(String[] args) throws Exception {
System.out.println(Pattern.matches("1", "1")); //true 1と1は一致
System.out.println(Pattern.matches("1", "12")); //false 1と12は一致しない
System.out.println(Pattern.matches(".2", "12")); //true 2つめの文字が2
System.out.println(Pattern.matches(".2", "123")); //false 2つめの文字が2だが3文字
System.out.println(Pattern.matches("..2", "123")); //false 3文字だが3つめの文字は3
System.out.println(Pattern.matches("..3", "123")); //true 3つめの文字が3
System.out.println(Pattern.matches("1..", "123")); //true 1つめの文字が1

}
}

解説

正規表現パターンで文字列を検索する時にはPatternクラスが利用できます。

ドット「.」は正規表現で調べると「1文字を表す」と書かれております。
文字だけでは何のことか全く理解できませんでしたが、ドットを使うことで特定の文字数の何番目の文字が何か調べることができます。

matches() を使ったドット「.」の書き方 3例

上記ドットを用いた書き方、3例です。

import java.util.; import java.util.regex.;
public class Main {
public static void main(String[] args) throws Exception {
//1つめ
boolean sample1 = Pattern.matches(".2", "12");

// 2つめ
Pattern p = Pattern.compile(".2"); // Patternでパターンを作成
Matcher m = p.matcher("12"); // Matcherでマッチング
boolean sample2 = m.matches(); // PatternとMatcherの結果を true or false 判定

//3つめ (2つ目を一行で書く)
boolean sample3 = Pattern.compile(".2").matcher("12").matches();

System.out.println(sample1); //true
System.out.println(sample2); //true
System.out.println(sample3); //true

}
}

それぞれ用途に合わせて使うのですが、初心者としては2つ目の書き方を覚えておけばパターンでコンパイルした正規表現のパターンを使い回すことができます。

matches() と正規表現の?と[ ]を使ったサンプルコード

少し多いですがまとめて書きます。

import java.util.; import java.util.regex.;
public class Main {
public static void main(String[] args) throws Exception {

System.out.println(Pattern.matches("あいう?えお", "あいうえお"));
//true 直前の文字「う」が1回登場

System.out.println(Pattern.matches("あいう?えお", "あいえお"));
//true 直前の文字「う」が0回登場

System.out.println(Pattern.matches("あいう?えお", ""));
//false 「あいうえお」に「」はマッチしない

System.out.println(Pattern.matches("[あいう]?", "あ"));
//true 直前の文字列「あ」「い」「う」の「あ」が1回登場

System.out.println(Pattern.matches("[あいう]?", "ああ"));
//false 直前の文字列「あ」「い」「う」の「あ」が2回登場

System.out.println(Pattern.matches("[あいう]?", "あいう"));
//false 直前の文字列「あ」「い」「う」に「あいう」はマッチしない

System.out.println(Pattern.matches("[あいう]?", ""));
//true 直前の文字列「あ」「い」「う」が0回登場

}
}

解説

?は直前の文字が0個か1個の時を意味します。
[]には任意の文字を1文字として利用できます。

matches() と正規表現 +と[]を使ったサンプルコード

まだまだ初級だけれど、正規表現が複雑になるとややこしいですね。

import java.util.; import java.util.regex.;
public class Main {
public static void main(String[] args) throws Exception {

System.out.println(Pattern.matches("[あいう]+", "あ"));
//true 直前の文字列「あ」「い」「う」の「あ」が1回登場

System.out.println(Pattern.matches("[あいう]+", "あああ"));
//true 直前の文字列「あ」「い」「う」の「あ」が1回以上繰り返し

System.out.println(Pattern.matches("[あ-う]+", "ああいいいうううう"));
//true 直前の文字列「あ」「い」「う」の「あ」または「い」または「う」が1回以上繰り返し

System.out.println(Pattern.matches("[あ-う]+", "ああかきくう"));
//false 直前の文字列「あ」「い」「う」に「か」「き」「く」がパターンに不一致

System.out.println(Pattern.matches("[あ-う]+", "いいいい"));
//true 直前の文字列「あ」「い」「う」の「い」が1回以上繰り返し

}
}

解説

+は直前の文字の 1 回以上の繰り返しの時を意味します。
[あいう]は[あ-う]と省略して書くこともできます。数字は[0-9]、英字は[a-z]となります。

matches() と*と()を使ったサンプルコード

まだまだある。

import java.util.; import java.util.regex.;
public class Main {
public static void main(String[] args) throws Exception {

System.out.println(Pattern.matches("(あいう)", "ああいいうう"));
//false 直前の文字列「あいう」に「ああいいうう」が不一致

System.out.println(Pattern.matches("(あいう)", "あいうあいう"));
//true 直前の文字列「あいう」に「あいう」が2回繰り返し

System.out.println(Pattern.matches("(あいう)*", ""));
//true 直前の文字列「あいう」に「あいう」が0回繰り返し

}
}

解説

*は直前の文字の 0回以上の繰り返しの時を意味します。
()は丸括弧内の文字を文字列として扱えます。

matches() と正規表現 \dを使ったサンプルコード

定義済みの正規表現(\d)を使ってみます。

import java.util.; import java.util.regex.;
public class Main {
public static void main(String[] args) throws Exception {

System.out.println(Pattern.matches("\d", "あいう"));//false 数値ではない
System.out.println(Pattern.matches("\d", "1"));//true 数値が1個
System.out.println(Pattern.matches("\d", "1234"));//false 数値が2個以上
System.out.println(Pattern.matches("\d", "1あ"));//false 数値と文字
System.out.println(Pattern.matches("[0-9]", "1"));//true [0-9]で代替可


}
}

解説

\dは数値(digit)を表します。\dで全ての数値を表せ[0-9]と同等です。
バックスラッシュ「 \ 」は「 \ 」でエスケープさせています( // )。

matches() と正規表現 \Dを使ったサンプルコード

定義済みの正規表現「\D」を使ってみます。

import java.util.; import java.util.regex.;
public class Main {
public static void main(String[] args) throws Exception {

System.out.println(Pattern.matches("\D", "あ"));//true 数値じゃなくて文字が1個
System.out.println(Pattern.matches("\D", "+"));//true 数値じゃなくて記号
System.out.println(Pattern.matches("\D", "1"));//false 数値
System.out.println(Pattern.matches("\D", "123"));//false 数値
System.out.println(Pattern.matches("\D", "あ1"));//false 文字と数値
System.out.println(Pattern.matches("\D", "あいう"));
//false 数値じゃなくて文字だけど2個以上


}
}

解説

\Dは数値以外を表します。0-9以外となります。
[^0-9]と同等です。[^xyz]角括弧の中身以外を表します。(キャレット「^」)

以上少しですが、参考になれば幸いです。

参考

参考サイト : Java Regex | Regular Expression - javatpoint