1. 概要

このチュートリアルでは、正規表現を使用してJavaのメールアドレスを検証する方法を学習します。

2. Javaでの電子メール検証

ユーザー登録が行われているほぼすべてのアプリケーションで、電子メールの検証が必要です。

電子メールアドレスは、ローカル部分、 @ 記号、およびドメインの3つの主要部分に分けられます。 たとえば、「[email protected]」が電子メールの場合、次のようになります。

  • ローカル部分=ユーザー名
  • @ = @
  • ドメイン=domain.com

通常、すべての文字タイプと長さをカウントしてチェックする必要があるため、文字列操作技術を使用して電子メールアドレスを検証するには、多くの労力がかかる可能性があります。しかし、Javaでは、正規表現を使用することで、はるかに簡単になります。 。

ご存知のように、正規表現はパターンに一致する文字のシーケンスです。 次のセクションでは、いくつかの異なる正規表現メソッドを使用して電子メールの検証を実行する方法を説明します。

3. 単純な正規表現の検証

電子メールアドレスを検証するための最も単純な正規表現は、 ^(。+)@(\ S +)$です。

メールアドレスに@記号が含まれているかどうかのみをチェックします。 存在する場合、検証結果は true、を返します。存在しない場合、結果はfalseになります。 ただし、この正規表現は、電子メールのローカル部分とドメインをチェックしません。

たとえば、この正規表現によれば、 [email protected] は検証に合格しますが、 username#domain.comは検証に失敗します。

正規表現パターンに一致する簡単なヘルパーメソッドを定義しましょう。

public static boolean patternMatches(String emailAddress, String regexPattern) {
    return Pattern.compile(regexPattern)
      .matcher(emailAddress)
      .matches();
}

また、次の正規表現を使用して電子メールアドレスを検証するコードを記述します。

@Test
public void testUsingSimpleRegex() {
    emailAddress = "[email protected]";
    regexPattern = "^(.+)@(\\S+)$";
    assertTrue(EmailValidation.patternMatches(emailAddress, regexPattern));
}

電子メールアドレスに@記号がない場合も、検証に失敗します。

4. 厳密な正規表現の検証

次に、電子メールのドメイン部分だけでなく、ローカル部分もチェックする、より厳密な正規表現を記述しましょう。

^(?=。{1,64} @)[A-Za-z0-9 _-] +(\\。[A-Za-z0-9 _-] +)* @ [^-] [A-Za- z0-9-] +(\\。[A-Za-z0-9-] +)*(\\。[A-Za-z] {2、})$

この正規表現を使用すると、電子メールアドレスのローカル部分に次の制限が課せられます。

  • 0から9までの数値を使用できます。
  • aからzまでの大文字と小文字の両方が許可されます。
  • アンダースコア「_」、ハイフン「-」、およびドット「。」を使用できます。
  • ローカル部分の最初と最後にドットを付けることはできません。
  • 連続したドットは許可されていません。
  • ローカル部分の場合、最大64文字が許可されます。

この正規表現のドメイン部分の制限は次のとおりです。

  • 0から9までの数値を使用できます。
  • aからzまでの大文字と小文字の両方を使用できます。
  • ハイフン「-」とドット「。」 ドメイン部分の開始と終了では許可されていません。
  • 連続するドットはありません。

また、この正規表現をテストするためのコードを記述します。

@Test
public void testUsingStrictRegex() {
    emailAddress = "[email protected]";
    regexPattern = "^(?=.{1,64}@)[A-Za-z0-9_-]+(\\.[A-Za-z0-9_-]+)*@" 
        + "[^-][A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z]{2,})$";
    assertTrue(EmailValidation.patternMatches(emailAddress, regexPattern));
}

したがって、この電子メール検証手法を介して有効になる電子メールアドレスの一部は次のとおりです。

このメール検証では無効になるメールアドレスの候補リストを次に示します。

5. 非ラテン文字またはUnicode文字の電子メールを検証するための正規表現

前のセクションで見た正規表現は、英語で書かれた電子メールアドレスではうまく機能しますが、ラテン語以外の電子メールアドレスでは機能しません。

したがって、Unicode文字の検証にも使用できる正規表現を記述します。

^(?=。{1,64} @)[\\ p {L} 0-9 _-] +(\\。[\\ p {L} 0-9 _-] +)* @ [^-] [ \\ p {L} 0-9-] +(\\。[\\ p {L} 0-9-] +)*(\\。[\\ p {L}] {2、})$

この正規表現を使用して、Unicodeまたは非ラテン語の電子メールアドレスを検証し、すべての言語をサポートできます。

ご覧のとおり、この正規表現は、「 A-Za-Z」の部分を「\\ p {L」に変更したことを除いて、前のセクションで作成した厳密な正規表現と似ています。 }”。 これは、Unicode文字のサポートを有効にするためです。

テストを書いて、この正規表現を確認しましょう。

@Test
public void testUsingUnicodeRegex() {
    emailAddress = "用户名@领域.电脑";
    regexPattern = "^(?=.{1,64}@)[\\p{L}0-9_-]+(\\.[\\p{L}0-9_-]+)*@" 
        + "[^-][\\p{L}0-9-]+(\\.[\\p{L}0-9-]+)*(\\.[\\p{L}]{2,})$";
    assertTrue(EmailValidation.patternMatches(emailAddress, regexPattern));
}

この正規表現は、電子メールアドレスを検証するためのより厳密なアプローチを提供するだけでなく、非ラテン文字もサポートします。

6. 電子メール検証のためのRFC5322による正規表現

電子メールアドレスを検証するためのカスタム正規表現を作成する代わりに、RFC標準によって提供されるものを使用できます。

RFC822の更新バージョンであるRFC5322 は、電子メール検証の正規表現を提供します。

それをチェックしよう:

^ [a-zA-Z0-9 _!#$%&’* + / =? `{|}〜^ .-] + @ [a-zA-Z0-9 .-] + $

ご覧のとおり、これは非常に単純な正規表現であり、電子メール内のすべての文字を許可します。

ただし、パイプ文字(|)と一重引用符(’)は、クライアントサイトからサーバーに渡されるときに潜在的な SQLインジェクションのリスクをもたらすため、許可されません。

この正規表現を使用して電子メールを検証するコードを記述しましょう。

@Test
public void testUsingRFC5322Regex() {
    emailAddress = "[email protected]";
    regexPattern = "^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+@[a-zA-Z0-9.-]+$";
    assertTrue(EmailValidation.patternMatches(emailAddress, regexPattern));
}

7. トップレベルドメインの文字をチェックするための正規表現

メールアドレスのローカル部分とドメイン部分を確認するために正規表現を作成しました。 次に、メールのトップレベルドメインをチェックする正規表現も作成します。

以下の正規表現は、電子メールアドレスのトップレベルドメイン部分を検証します。

^ [\\ w!#$%&’* + / =? `{|}〜^-] +(?:\\。[\\ w!#$%&’ * + / =?` {|} 〜^-] +)* @(?:[a-zA-Z0-9-] + \\。)+ [a-zA-Z] {2,6} $

この正規表現は、基本的に、電子メールアドレスにドットが1つしかないかどうか、およびトップレベルドメインに最小2文字から最大6文字存在するかどうかをチェックします。

また、次の正規表現を使用してメールアドレスを確認するためのコードを記述します。

@Test
public void testTopLevelDomain() {
    emailAddress = "[email protected]";
    regexPattern = "^[\\w!#$%&'*+/=?`{|}~^-]+(?:\\.[\\w!#$%&'*+/=?`{|}~^-]+)*" 
        + "@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}$";
    assertTrue(EmailValidation.patternMatches(emailAddress, regexPattern));
}

8 。 連続、末尾、および先頭のドットを制限するための正規表現

次に、電子メールアドレスでのドットの使用を制限する正規表現を作成しましょう。

^ [a-zA-Z0-9 _!#$%&’* + / =? `{|}〜^-] +(?:\\。[a-zA-Z0-9 _!#$%&’ * + / =? `{|}〜^-] +)* @ [a-zA-Z0-9-] +(?:\\。[a-zA-Z0-9-] +)* $

上記の正規表現は、連続、先頭、および末尾のドットを制限するために使用されます。 したがって、電子メールには複数のドットを含めることができますが、ローカル部分とドメイン部分で連続することはできません。

コードを見てみましょう:

@Test
public void testRestrictDots() {
    emailAddress = "[email protected]";
    regexPattern = "^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^-]+(?:\\.[a-zA-Z0-9_!#$%&'*+/=?`{|}~^-]+)*@" 
        + "[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$";
    assertTrue(EmailValidation.patternMatches(emailAddress, regexPattern));
}

9. OWASP検証正規表現

この正規表現は、OWASP検証正規表現リポジトリによって提供され、電子メールの検証をチェックします。

^ [a-zA-Z0-9 _ +&*-] +(?:\\。[a-zA-Z0-9 _ +&*-] +)* @(?:[a-zA-Z0-9- ] + \\。)+ [a-zA-Z] {2、7}

この正規表現は、標準の電子メール構造でほとんどの検証もサポートします。

以下のコードを使用して、メールアドレスを確認しましょう。

@Test
public void testOwaspValidation() {
    emailAddress = "[email protected]";
    regexPattern = "^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$";
    assertTrue(EmailValidation.patternMatches(emailAddress, regexPattern));
}

10. メール用のGmailスペシャルケース

Gmailドメインにのみ適用される特別なケースが1つあります。それは、メールのローカル部分で文字+文字を使用する許可です。 Gmailドメインの場合、[email protected][email protected]の2つのメールアドレスは同じです。

また、[email protected][email protected]に似ています。

この特殊なケースの電子メール検証にも合格する、わずかに異なる正規表現を実装する必要があります。

^(?=。{1,64} @)[A-Za-z0-9 _- +] +(\\。[A-Za-z0-9 _- +] +)* @ [^-] [A- Za-z0-9-+] +(\\。[A-Za-z0-9-+] +)*(\\。[A-Za-z] {2、})$

このユースケースをテストする例を書いてみましょう。

@Test
public void testGmailSpecialCase() {
    emailAddress = "[email protected]";
    regexPattern = "^(?=.{1,64}@)[A-Za-z0-9\\+_-]+(\\.[A-Za-z0-9\\+_-]+)*@" 
        + "[^-][A-Za-z0-9\\+-]+(\\.[A-Za-z0-9\\+-]+)*(\\.[A-Za-z]{2,})$";
    assertTrue(EmailValidation.patternMatches(emailAddress, regexPattern));
}

11. 電子メール用のApacheCommonsValidator

Apache Commons Validator は、標準の検証ルールを含む検証パッケージです。 したがって、このパッケージをインポートすることで、電子メール検証を適用できます。

EmailValidator クラスを使用して、RFC822標準を使用する電子メールを検証できます。 このバリデーターには、電子メールを検証するためのカスタムコードと正規表現が混在しています。 特殊文字をサポートするだけでなく、これまでに説明したUnicode文字もサポートします。

プロジェクトにcommons-validator依存関係を追加しましょう。

<dependency>
    <groupId>commons-validator</groupId>
    <artifactId>commons-validator</artifactId>
    <version>${validator.version}</version>
</dependency>

これで、次のコードを使用してメールアドレスを検証できます。

@Test
public void testUsingEmailValidator() {
    emailAddress = "[email protected]";
    assertTrue(EmailValidator.getInstance()
      .isValid(emailAddress));
}

12. どの正規表現を使用する必要がありますか?

この記事では、電子メールアドレスの検証に正規表現を使用するさまざまなソリューションについて説明しました。 明らかに、使用するソリューションの決定は、検証をどの程度厳密にするか、および正確な要件によって異なります。

たとえば、電子メール内の @ 記号の存在を確認するために単純な正規表現が必要な場合は、セクション3の単純な正規表現を使用できます。 ただし、より詳細な検証のために、RFC5322標準に基づいてセクション6からより厳密な正規表現ソリューションを選択できます。

最後に、電子メールでUnicode文字を処理している場合は、セクション5で提供されている正規表現ソリューションを使用できます。

13. 結論

この記事では、正規表現を使用してJavaで電子メールアドレスを検証するさまざまな方法を学びました。

この記事の完全なコードは、GitHubから入手できます。