import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class EmailValidationExample {
public static void main(String[] args) {
// ユーザーからの入力を受け取る
Scanner scanner = new Scanner(System.in);
System.out.println("電子メールアドレスを入力してください:");
String email = scanner.nextLine();
scanner.close();
// 電子メールアドレスの正規表現パターン
String emailRegex = "^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$";
// 正規表現パターンをコンパイル
Pattern pattern = Pattern.compile(emailRegex);
// 入力された文字列と正規表現を比較
Matcher matcher = pattern.matcher(email);
// メッセージを表示
if (matcher.matches()) {
System.out.println("有効な電子メールアドレスです。");
} else {
System.out.println("無効な電子メールアドレスです。");
}
}
}
この例では、標準入力からユーザーからの電子メールアドレスを受け取り、正規表現パターンを使用して有効性を検証しています。ただし、電子メールアドレスの正規表現は非常に複雑であり、全てのケースに対応することは難しいです。プロダクション環境ではライブラリやフレームワークの機能を利用するか、より厳密な正規表現パターンを考慮することが推奨されます。
Patternクラス
java.util.regex.Pattern クラスは、正規表現パターンを表すためのクラスです。正規表現は、文字列のパターンマッチングや検索、置換などの文字列操作を柔軟かつ効果的に行うために使用されます。Pattern クラスは、正規表現をコンパイルし、その後にこのパターンを使用して文字列操作を行います。
以下は、Pattern クラスの主なメソッドとその解説です:
compile(String regex):- パターンをコンパイルします。指定された正規表現が無効な場合、
PatternSyntaxExceptionがスローされます。
- パターンをコンパイルします。指定された正規表現が無効な場合、
matcher(CharSequence input):- 指定された文字列に対するマッチャーオブジェクトを作成します。このマッチャーオブジェクトは、パターンに基づいて文字列上での操作を行います。
split(CharSequence input):- 指定された文字列をパターンに基づいて分割し、
String[]配列として返します。
- 指定された文字列をパターンに基づいて分割し、
matches():- パターンが文字列全体に対して完全に一致するかどうかを判定します。
find():- パターンが文字列内で部分的に一致するかどうかを判定します。見つかった場合、次に進みます。
group():- 最後に成功したマッチング操作において、指定されたグループの部分文字列を取得します。
pattern():- コンパイルされた正規表現パターンを取得します。
flags():- パターンのフラグ(例: 大文字・小文字を区別するかどうか)を取得します。
Pattern クラスを使用する際には、まず compile() メソッドで正規表現パターンをコンパイルし、その後、matcher() メソッドで対象となる文字列に対するマッチャーオブジェクトを取得して操作を行います。正規表現には特定の構文があり、慣れるまで少し学習が必要です。
Matcherクラス
Matcher クラスは、正規表現に基づいて文字列に対してパターンマッチングを行うためのクラスです。Matcher クラスは Pattern クラスの matcher() メソッドによって得られ、検索や置換などの操作を行います。
以下は、Matcher クラスの主なメソッドとその解説です:
matches():- パターンが文字列全体に対して完全に一致するかどうかを判定します。一致する場合は
true、そうでない場合はfalseを返します。
- パターンが文字列全体に対して完全に一致するかどうかを判定します。一致する場合は
find():- パターンが文字列内で部分的に一致するかどうかを判定します。一致する場合は
trueを返し、次に進みます。次の一致がない場合はfalseを返します。
- パターンが文字列内で部分的に一致するかどうかを判定します。一致する場合は
start():- 最後に成功した一致操作の開始位置(インデックス)を返します。
end():- 最後に成功した一致操作の終了位置(インデックス + 1)を返します。
group():- 最後に成功した一致操作において、指定されたグループの部分文字列を取得します。グループは正規表現内の括弧で指定された部分です。
groupCount():- 正規表現内のグループの数を返します。
Matcher クラスを使用する基本的な流れは次のとおりです:
Patternクラスのcompile()メソッドを使用して正規表現パターンをコンパイルし、matcher()メソッドを呼び出してMatcherオブジェクトを得ます。Matcherオブジェクトのメソッド(matches()、find()、start()、end()、group()など)を使用してパターンマッチングを実行します。- 必要に応じて、パターンが複数回一致する場合や、グループを利用する場合は、ループや条件分岐を使用して適切な処理を行います。
Matcher クラスは柔軟で強力な文字列操作を提供しますが、正規表現の理解と使い方が必要です。
正規表現
正規表現(Regular ExpressionsまたはRegex)は、文字列のパターンを定義するための特殊な文字列です。主に文字列の検索、置換、パターンマッチングなどの文字列操作に使用されます。Javaでは、java.util.regex パッケージで正規表現をサポートしています。
以下は、正規表現の基本的な要素とその解説です:
- 文字とメタ文字:
- 一般的な文字はそのまま使われます。ただし、メタ文字(特殊な意味を持つ文字)はエスケープするか、特定の文脈で使用されると特殊な機能を持ちます。例えば、
.(ピリオド)はどんな文字にも一致しますが、\.とエスケープすると実際のピリオドと一致します。
- 一般的な文字はそのまま使われます。ただし、メタ文字(特殊な意味を持つ文字)はエスケープするか、特定の文脈で使用されると特殊な機能を持ちます。例えば、
- キャラクタクラス:
[ ]で括られた中の文字列と一致します。例えば、[aeiou]は母音に一致します。
- 範囲指定のキャラクタクラス:
[a-z]のように範囲を指定することも可能です。この例は小文字のアルファベットに一致します。
- 否定のキャラクタクラス:
[^0-9]は数字以外に一致します。
- ワイルドカード:
.(ピリオド)はどんな1文字にも一致します。
- 量指定子:
*は直前の文字やグループが0回以上繰り返すことを示し、+は1回以上、?は0回または1回です。
- グルーピング:
( )で括られた部分は一つのグループとして扱われます。例えば、(ab)+は”ab”、”abab”、”ababab”などに一致します。
- アンカー:
^は文字列の先頭に一致し、$は文字列の末尾に一致します。
- エスケープ:
- 特殊文字をそのまま検索するためにはバックスラッシュ
\を使います。例えば、\.はピリオド自体に一致します。
- 特殊文字をそのまま検索するためにはバックスラッシュ
Javaでは正規表現を使用するために、Pattern クラスと Matcher クラスが提供されています。これらのクラスを使用して正規表現をコンパイルし、文字列と一致させることができます。正規表現は非常に強力で柔軟なツールであり、効果的な文字列操作やバリデーションに利用されます。
実習で理解を深めよう / Practice to deepen your understanding
この内容についてJavaDrillで実際に手を動かして学習できます
Practice with JavaDrill to learn hands-on


