Java の正規表現について
正規表現(Regular Expression)は、文字列のパターンマッチングや操作を簡単にするための強力なツールです。このページでは、Javaで正規表現を使用する方法について、例を交えながら詳しく説明します。
正規表現の基本概念
正規表現は、文字列のパターンを記述するための特殊な構文を提供します。これにより、文字列が特定の条件に一致するかを判定したり、文字列を検索・置換したりすることができます。
例えば、以下のようなパターンを記述できます。
- 特定の単語が含まれているか(例: “cat”)
- 数字のみで構成されているか(例: “\\d+”)
- メールアドレス形式か(例: “[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}”)
正規表現の構文
Javaの正規表現の構文は、一般的な正規表現の標準仕様(Perl互換正規表現)に基づいています。以下に主な構文を示します。
- 文字クラス:
[abc]
は “a”, “b”, または “c” のいずれかにマッチ。 - 否定文字クラス:
[^abc]
は “a”, “b”, “c” 以外の文字にマッチ。 - 繰り返し:
a*
(0回以上)、a+
(1回以上)、a{3}
(3回ちょうど)など。 - 任意の文字:
.
は任意の1文字にマッチ。 - エスケープ文字:
\\
を使って特別な意味を持つ文字をエスケープ。
その他の構文については、公式ドキュメントやリファレンスを参照してください。
Java で正規表現を使う方法
Javaでは、正規表現を使用するために java.util.regex
パッケージが提供されています。このパッケージには主に以下の2つのクラスがあります。
Pattern
: 正規表現を表現するクラス。Matcher
: 正規表現のパターンと文字列を比較するためのクラス。
基本的な使用方法は以下の通りです。
import java.util.regex.*;
public class RegexExample {
public static void main(String[] args) {
String pattern = "\\d+"; // 数字にマッチする正規表現
String text = "Java 8 and Java 11 are popular versions.";
// Pattern と Matcher を使う方法
Pattern compiledPattern = Pattern.compile(pattern);
Matcher matcher = compiledPattern.matcher(text);
while (matcher.find()) {
System.out.println("Found: " + matcher.group());
}
// String クラスの matches メソッドを使う方法
boolean matches = text.matches(".*Java.*");
System.out.println("Contains 'Java': " + matches);
}
}
よく使われる例
以下は、実際に役立つ正規表現の例です。
- メールアドレスの検証:
[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}
- 数字のみ:
\\d+
は1つ以上の数字にマッチ。 - 郵便番号の形式(例: 日本の郵便番号):
\\d{3}-\\d{4}
- 特定の単語を含む:
\\bJava\\b
は “Java” という単語全体にマッチ。
String emailPattern = "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}";
String email = "example@test.com";
System.out.println(email.matches(emailPattern)); // true
応用的なテクニック
Javaの正規表現では、以下のような応用的なテクニックも使用可能です。
- グループ化:
(...)
を使って部分的なパターンをグループ化できます。 - 名前付きグループ: 一部のJavaバージョンでは、
(?<name>...)
を使用して名前付きグループを定義できます。 - 置換:
String.replaceAll
メソッドを使用して置換操作を行います。
String text = "Price: $100, Discount: $20";
String updatedText = text.replaceAll("\\$\\d+", "$0.00"); // 数値の後に ".00" を追加
System.out.println(updatedText); // Price: $100.00, Discount: $20.00
さらに詳しいテクニックやチュートリアルについては、公式ドキュメントやオンラインリソースを参照してください。