Java
 Computer >> コンピューター >  >> プログラミング >> Java

未入力(空欄)にも対応したメールアドレス検証用のJava正規表現プログラム

フォームの入力チェックなどでは、「メールアドレス欄が任意入力(空欄でもよい)」というケースによく遭遇します。そんなときに役立つのが、空欄の入力も有効として扱えるメールアドレス検証用の正規表現です。本記事では、未入力(空文字)の場合も許容しつつ、通常のメールアドレスの形式を正しく判定できる正規表現と、それをJavaで実装する2つのサンプルコードをわかりやすく解説します。

使用する正規表現は次のとおりです。

^([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6})?$

正規表現の各要素の意味

  • ^:文字列の先頭にマッチすることを示します。

  • [a-zA-Z0-9._%+-]:@記号の前に置ける1文字を表し、英字(大文字・小文字)、数字、および「+」「_」「.」「%」「-」のいずれかにマッチします。

  • +:直前の文字セットが1回以上繰り返されることを意味します。

  • @:アットマークそのものにマッチします。

  • [a-zA-Z0-9.-]:@記号の後に置ける1文字を表し、英字(大文字・小文字)、数字、「.」「-」のいずれかにマッチします。

  • \.[a-zA-Z]{2,6}:「.」の後に続く、2〜6文字のアルファベットで構成されるドメイン部分(TLD)にマッチします。

  • $:文字列の末尾を示します。

  • (...)?:括弧内のパターン全体を省略可能(0回または1回)にしています。この「?」があるため、空文字(未入力)でもマッチします。

例1:ScannerとPattern・Matcherクラスを使った検証

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class SampleTest {
    public static void main(String args[]) {
        String regex = "^([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6})?$";

        // ユーザーからの入力を受け取る
        Scanner sc = new Scanner(System.in);
        System.out.println("名前を入力してください: ");
        String name = sc.nextLine();
        System.out.println("メールアドレスを入力してください: ");
        String e_mail = sc.nextLine();
        System.out.println("年齢を入力してください: ");
        int age = sc.nextInt();

        // Patternクラスのインスタンスを生成
        Pattern pattern = Pattern.compile(regex);

        // Matcherクラスのインスタンスを生成
        Matcher matcher = pattern.matcher(e_mail);

        // マッチしたかどうかを判定
        if (matcher.find()) {
            System.out.println("メールアドレスは有効です");
        } else {
            System.out.println("メールアドレスは無効です");
        }
    }
}

実行結果1(メールアドレス未入力)

名前を入力してください: 
krishna
メールアドレスを入力してください: 
(何も入力せずにEnterキーを押下)
年齢を入力してください: 
20
メールアドレスは有効です

実行結果2(通常のメールアドレス)

名前を入力してください: 
Rajeev
メールアドレスを入力してください: 
rajeev.123@gmail.com
年齢を入力してください: 
25
メールアドレスは有効です

例2:String.matches()メソッドを使ったシンプルな検証

import java.util.Scanner;

public class Example {
    public static void main(String args[]) {
        // ユーザーから文字列を受け取る
        System.out.println("メールアドレスを入力してください: ");
        Scanner sc = new Scanner(System.in);
        String e_mail = sc.nextLine();

        // 正規表現パターン
        String regex = "^([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6})?$";

        boolean result = e_mail.matches(regex);
        if (result) {
            System.out.println("有効なメールアドレス形式です");
        } else {
            System.out.println("無効なメールアドレス形式です");
        }
    }
}

実行結果1(通常のメールアドレス)

メールアドレスを入力してください: 
rajeev.123@gmail.com
有効なメールアドレス形式です

実行結果2(未入力)

メールアドレスを入力してください: 
(何も入力せずにEnterキーを押下)
有効なメールアドレス形式です

補足:実装時の注意点

  • このパターンでは空欄が「有効」と判定されます。メールアドレスを必須項目にしたい場合は、末尾の「?」を取り除き、^([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6})$ のように変更してください。

  • {2,6} はトップレベルドメイン(TLD)を2〜6文字に制限しています。「.technology」など最近増えている長いgTLDまで許可したい場合は、{2} などに調整を検討しましょう。

  • より厳密なRFC準拠の検証が必要な場合は、jakarta.mailInternetAddress クラスなどを利用する方法もあります。

  1. Javaの正規表現\Dメタ文字とは?数字以外にマッチさせる方法を解説

    Javaの正規表現におけるサブ表現(メタ文字)「\D」は、数字以外の文字(非数字)にマッチします。 「\D」は、数字1文字にマッチする「\d」と対になるメタ文字です。文字クラスで表すと「[^0-9]」と同等であり、英字・記号・空白など、0〜9以外のあらゆる文字にマッチします。 \Dに関連する主なメタ文字一覧 メタ文字意味 \d数字1文字([0-9]と同等) \D数字以外の1文字([^0-9]と同等) \s空白文字(スペース・タブ・改行など) \S空白以外の1文字 \w単語構成文字([a-zA-Z_0-9]と同等) \W単語構成文字以外の1文字 例1:\Dにマッチする文字数を数える

  2. Pythonの正規表現を使ってメールアドレスを検証する方法

    Pythonでは、標準ライブラリの re モジュールを使った正規表現によって、与えられたメールアドレス(メールID)が正しい形式かどうかを簡単に検証できます。以下のコードは、任意のメールアドレスを正規表現でチェックする基本的な例です。サンプルコードimport re s = manogna.neelam@tutorialspoint.com match = re.search(r\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2}\b, s, re.I) print(match.group())実行結果このコードを実行すると、次のような出力が得られます。manogna