8

この質問が以前に尋ねられたとは思いません...確かに、この要件で何かを見つけることはできません。

バックグラウンド

人の ID を返す API があります。一般に、ID は大文字と小文字を区別するものとして扱われるべきですが、ID が実際にメール アドレスである場合、メール アドレスの大文字と小文字が混在したバージョンを返すこの API の実装が優れていない場合、楽しいことがたくさんあります...

つまり、1つの実装と話している...それはURLのようなものをIDとして返します。

  • http://foo.bar.com/blahblahblah

次に、別の実装と話している可能性があります...それは、明らかでないIDを返します。

  • as€jlhdésdj678hjghas7t7qhjdhg£

素敵な小文字の電子メールアドレスを返す素敵な実装と話している可能性があります。

  • bob.mcspam@acme.org

または、まったく同等の ID を返すあまり優れていない実装と話している可能性があります。

  • bob.mcspam@ACME.org

RFC 2821 は、メールボックスのみが大文字と小文字を区別すると述べていますが、大文字と小文字の区別を悪用すると、多くの相互運用の問題が発生します...

私がやりたいことは、電子メールである文字列を特定し、ドメインを小文字にすることです。文字列のような URI を識別するのは簡単です。スキームは or のいずれhttphttpsであり、ドメイン名を小文字にするだけでよく、解析がはるかに簡単です。

質問

外部サービスから提供された文字列が与えられた場合、その文字列が電子メール アドレスであるかどうかを判断して、ドメイン名を強制的に小文字にすることができるテストはありますか?

わずかな割合の電子メール アドレスが見落とされ、ドメイン名が小文字に変換されないことは許容されます。(偽陰性は許容)

メールアドレスのドメイン部分でない場合、文字列の一部を強制的に小文字にすることはできません。(偽陽性は許されません)

 アップデート

この質問は、これこれとは微妙に異なることに注意してください。これらの 2 つの質問のコンテキストでは、文字列が電子メール アドレスであることを既に知っているからです。

この質問の文脈では、文字列がメールアドレスなのか他の何かなのかわかりません...それがこの質問の違いです

4

5 に答える 5

12

-以下のコードを試してみてください。これは役に立つかもしれません。

public class EmailCheck {

    public static void main(String[] args){


        String email = "vivek.mitra@gmail.com";
        Pattern pattern = Pattern.compile("[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}");
        Matcher mat = pattern.matcher(email);

        if(mat.matches()){

            System.out.println("Valid email address");
        }else{

            System.out.println("Not a valid email address");
        }
    }

}

-を使用した別のより深い検証を示しているこのサイトもご覧regular expressionください。正規表現を使用したより深い検証

于 2013-08-27T11:59:48.270 に答える
2

@Dukelingに感謝

private static toLowerCaseIfEmail(String string) {
    try {
        new InternetAddress(string, true);
    } catch (AddressException e) {
        return string;
    }
    if (string.trim().endsWith("]")) {
        return string;
    }
    int lastAt = string.lastIndexOf('@');
    if (lastAt == -1) {
        return string;
    }
    return string.substring(0,lastAt)+string.substring(lastAt).toLowerCase();
}

私が言えることから、必要なことをしなければなりません

アップデート

(comment)前のものは最後の ... の後の構文の可能性を無視したので、それ@に直面することができます.

private static toLowerCaseIfEmail(String string) {
    try {
        new InternetAddress(string, true);
    } catch (AddressException e) {
        return string;
    }
    int lastAt = string.lastIndexOf('@');
    if (lastAt == -1 
        || string.lastIndexOf(']') > lastAt
        || string.lastIndexOf(')' > lastAt) {
        return string;
    }
    return string.substring(0,lastAt)+string.substring(lastAt).toLowerCase();
}
于 2013-08-27T11:30:06.323 に答える
2

私の提案は使用することです:

org.apache.commons.validator.routines.EmailValidator.isValid(value::String)

https://commons.apache.org/proper/commons-validator/apidocs/org/apache/commons/validator/routines/EmailValidator.html

于 2019-01-10T05:49:53.750 に答える
0
        Pattern pattern = Pattern.compile("^[A-Za-z0-9._]{1,16}+@{1}+[a-z]{1,7}\\.[a-z]{1,3}$");
        Matcher mail = pattern.matcher(your_mail);

        if (mail.find()) {
            System.out.println("True");
        } else {
            System.out.println("False");
        }
于 2016-07-20T12:13:36.490 に答える