まずは今回の主題である正規表現とは、文字列のパターンを特殊な記号(メタ文字)を使って1つにまとめ、文章の検索、抽出を効率よく行うための表現方法のこと。ここではこの正規表現を使ってできることと、使用するメソッドを学んだので紹介する。
前提知識
-
charAt()-Stringクラスのメソッド。public char charAt(int index)と定義されているので、対象の文字列から引数で指定した整数番号の文字(char型)を返す -
matches()-Stringクラスのメソッドでpublic boolean matches(String regex)と定義されている。この引数regex(Regular Expression)は日本語では「正規表現」という意味なので、このメソッドの引数に正規表現を渡していく
正規表現の基本文法
先ほど紹介したmatches()メソッドに様々な正規表現を渡しながら、正規表現の基本文法を以下のようにして学ぶことができる。
文字列が指定したパターンと一致するかを判定。
1. 完全一致
引数に渡した文字列と完全に一致するかどうかを判定(大文字・小文字も区別)。
String s = "Java";
System.out.println(s.matches("Java")); // true
System.out.println(s.matches("JavaJava")); // false
System.out.println(s.matches("java")); // false
2. 任意の1文字(.)
.(ピリオド)は「任意の1文字」として扱われる。
String s = "Java";
System.out.println(s.matches("J.va")); // true (「.」が「a」にマッチ)
System.out.println(s.matches("JavaJ...")); // false (文字数が合わない)
System.out.println(s.matches(".ava")); // true (「.」が「J」にマッチ)
3. 指定回数の繰り返し({n})
直前の文字を指定した回数分だけ繰り返すパターンを作る。
String s = "Java";
System.out.println(s.matches("J.{3}")); // true (Jの後ろに「任意の文字が3つ」)
System.out.println(s.matches("Java.{4}")); // false
System.out.println(s.matches(".{4}")); // true (任意の文字が4つ=4文字の文字列)
4. 0回以上の繰り返し(*)
*(アスタリスク)は、直前の文字の0回以上の繰り返しを意味する。
⚠️ 注意: 他言語の「ワイルドカード(何でも良い文字列)」とは異なり、Javaでは必ず直前の文字と組み合わせて使用するため注意が必要。
String s = "Java";
System.out.println(s.matches("J.*")); // true (J の後ろに「任意の文字が0文字以上」)
System.out.println(s.matches("Jav*")); // false (vの繰り返し。最後がaなので不一致)
System.out.println(s.matches("Java*")); // true (aの繰り返しだが、0回繰り返しも含む)
System.out.println(s.matches("Java.*")); // true (Java の後ろに「0文字以上」)
5. いずれかの1文字([])と 範囲(-)
[] は中に記述された文字のいずれか1文字、[-] は文字の「範囲」を意味する。
String s = "Java";
System.out.println(s.matches("[Jj]ava")); // true (J または j で始まる "Java")
System.out.println(s.matches("J[a-z]va")); // true (a から z までの範囲のいずれか1文字)
System.out.println(s.matches("J[A-Z]va")); // false (大文字のA-Zではないため不一致)
6. 否定([^])
[] の中にある ^(ハット)は、「〜以外の文字」 という否定を意味する。
String s = "Java";
System.out.println(s.matches("J[^b-z]va")); // true (bからz「以外」の文字=aにマッチ)
System.out.println(s.matches("J[^a-z]va")); // false (aからz「以外」ではないため不一致)
7. 定義済みの文字クラス(\\d, \\w, \\s)
よく使われる文字の集まり(数字や英単語文字など)を、簡単に表すための省略記法。
-
\d:数字([0-9]と同じ) -
\w:単語構成文字(アルファベット、数字、アンダーバー。[a-zA-Z_0-9]と同じ) -
\s:空白文字(スペース、タブ、改行など)
⚠️ Javaでの注意点:
Javaの文字列("")の中では、バックスラッシュ(または円マーク)自体をエスケープする必要があるため、コード内では\\dのように2つ重ねて記述。
String s = "Java2026";
System.out.println(s.matches("Java\\d{4}")); // true (Javaの後ろに数字が4つ)
System.out.println(s.matches("\\w{8}")); // true (英数字・アンダーバーで構成された8文字)
System.out.println(s.matches("Java\\s.*")); // false (空白文字が含まれていないため不一致)
8. 行頭(^)と 行末($)
^ は文字列の先頭(行頭)、$ は文字列の末尾(行末)を表す。
💡 補足: Javaの
matches()メソッドはデフォルトで文字列全体に完全一致する必要があるため、単体で使う場合は省略可能だが、複雑なパターンを組む際や他のメソッド(find()など)で重要。
String s = "Java";
System.out.println(s.matches("^Java$")); // true (Javaで始まり、Javaで終わる文字列)
System.out.println(s.matches("^J.*")); // true (Jで始まる文字列)
System.out.println(s.matches(".*a$")); // true (aで終わる文字列)
分割や置換で役立つメソッド
split()メソッド
Stringクラスのメソッド。public String[] split(String regex)と定義されているので、引数に正規表現を用い、指定された正規表現に一致する位置で分割する。返り値は文字列の配列String[]となる。
String s = "0000|abc,def:ghi|jkl";
String[] words = s.split("[,:|]");
for (String w : words) {
System.out.print(w + "->");
}
//出力結果
//0000->abc->def->ghi->jkl->
replaceAll()メソッド
Stringクラスのメソッド。public String replaceAll(String regex, String replacement)と定義されており、第一引数に正規表現を受け取り、そこで指定された正規表現に一致する文字列部分に対し、第2引数に渡された文字列へ置換を実行する。
String s = "0123|abc,def:ghi|jkl";
String w = s.replaceAll("[1beh]", "X");
System.out.print(w);
//出力結果
//0X23|aXc,dXf:gXi|jkl