349

Androidで(ユーザー入力フィールドなどから)電子メールアドレスを検証するための優れた手法は何ですか?org.apache.commons.validator.routines.EmailValidatorが利用できないようです。すでにAndroidに含まれている、これを実行している他のライブラリはありますか、それともRegExpを使用する必要がありますか?

4

36 に答える 36

1101

もう 1 つのオプションは、API レベル 8 以降の組み込みのパターンです。

public final static boolean isValidEmail(CharSequence target) {
  if (TextUtils.isEmpty(target)) {
    return false;
  } else {
    return android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches();
  }
}

パターン表示可能なソース

また

@AdamvandenHoven からの 1 行のソリューション:

public final static boolean isValidEmail(CharSequence target) {
  return !TextUtils.isEmpty(target) && android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches();
}
于 2011-10-24T22:59:53.930 に答える
72

API 8 (android 2.2) 以降、パターンがあります: android.util.Patterns.EMAIL_ADDRESS http://developer.android.com/reference/android/util/Patterns.html

したがって、それを使用して yourEmailString を検証できます。

private boolean isValidEmail(String email) {
    Pattern pattern = Patterns.EMAIL_ADDRESS;
    return pattern.matcher(email).matches();
}

メールが有効な場合は true を返します

UPD: このパターンのソース コードは次のとおりです。

public static final Pattern EMAIL_ADDRESS
    = Pattern.compile(
        "[a-zA-Z0-9\\+\\.\\_\\%\\-\\+]{1,256}" +
        "\\@" +
        "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}" +
        "(" +
            "\\." +
            "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,25}" +
        ")+"
    );

参照: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/util/Patterns.java

したがって、API < 8 との互換性のために自分でビルドできます。

于 2012-04-09T07:56:47.513 に答える
59

これで、単純な Email パターン マッチャーができました。

ジャワ:

 private static boolean isValidEmail(String email) {
        return !TextUtils.isEmpty(email) && android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches();
    }

コトリン関数:

 private fun isValidEmail(email: String): Boolean {
        return !TextUtils.isEmpty(email) && Patterns.EMAIL_ADDRESS.matcher(email).matches()
    }

コトリン拡張:

fun String.isValidEmail() =
    !TextUtils.isEmpty(this) && Patterns.EMAIL_ADDRESS.matcher(this).matches()
于 2016-05-10T15:29:01.360 に答える
52

正規表現を使用しないでください。

どうやら、以下はRFC 2822に準拠するほとんどの電子メール アドレスを正しく検証する正規表現です (「user@gmail.com.nospam」などでは失敗しますが、org.apache.commons.validator.ルーチン.EmailValidator)

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

おそらく、電子メールを検証する最も簡単な方法は、提供されたアドレスに確認の電子メールを送信するだけで、バウンスすると無効になります。

いくつかの基本的なチェックを実行したい場合は、それがフォームにあることを確認するだけです*@*

ビジネスロジック固有の検証がある場合は、正規表現を使用してそれを実行できます。たとえば、gmail.com アカウントなどである必要があります。

于 2009-11-30T11:08:00.670 に答える
12

これには正規表現を使用できます。次のようなもの。

Pattern pattern = Pattern.compile(".+@.+\\.[a-z]+");
String email = "xyz@xyzdomain.com";
Matcher matcher = pattern.matcher(email);
boolean matchFound = matcher.matches();

注: 上記の正規表現を確認し、そのまま使用しないでください。

于 2010-12-03T04:18:37.453 に答える
12

以下のように android:inputType="textEmailAddress" を使用します。

       <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="email"
        android:inputType="textEmailAddress"
        android:id="@+id/email"
        />

と:

       boolean isEmailValid(CharSequence email) {
        return android.util.Patterns.EMAIL_ADDRESS.matcher(email)
                .matches();
      }
于 2015-04-24T10:35:12.583 に答える
5

メールアドレスを「検証」しようとしないことを強くお勧めできますか?

入力内容が独自のコードを壊さないことを確認してください。たとえば、例外を引き起こす可能性のあるスペースや不正な文字がないことを確認してください。

それ以外の場合は、最小限の収益のために多くの作業が必要になります...

于 2011-10-25T00:35:44.027 に答える
4
    public boolean isValidEmail(String email)
{
    boolean isValidEmail = false;

    String emailExpression = "^[\\w\\.-]+@([\\w\\-]+\\.)+[A-Z]{2,4}$";
    CharSequence inputStr = email;

    Pattern pattern = Pattern.compile(emailExpression, Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher(inputStr);
    if (matcher.matches())
    {
        isValidEmail = true;
    }
    return isValidEmail;
}
于 2012-11-01T08:02:59.523 に答える
2

ここで重要なのは、電子メール アドレスを完全に検証することです。構文が正しいかどうかを確認するだけでなく、電子メール アドレスが本物かどうかを確認する必要があります。

明らかな理由が 2 つあります。実際のユーザーはメール アドレスを間違って入力することが多く一部のユーザーは偽のメール アドレスを入力する可能性があります。したがって、構文チェックと存在チェックを行う必要があります。

私が Android で見つけたこれを行う最善の方法は、無料のCloudmersive Validation APIを使用することです。

コードは次のようになります。

ApiClient defaultClient = Configuration.getDefaultApiClient();

// Configure API key authorization: Apikey
ApiKeyAuth Apikey = (ApiKeyAuth) defaultClient.getAuthentication("Apikey");
Apikey.setApiKey("YOUR API KEY");

EmailApi apiInstance = new EmailApi();
String email = "email_example"; // String | Email address to validate, e.g. \"support@cloudmersive.com\". The input is a string so be sure to enclose it in double-quotes.
try {
    FullEmailValidationResponse result = apiInstance.emailFullValidation(email);
    System.out.println(result);
} catch (ApiException e) {
    System.err.println("Exception when calling EmailApi#emailFullValidation");
    e.printStackTrace();
}

私はすべてのアプリでこれを使用していますが、エントリの時点でUXの電子メール アドレスを検証できるため、優れています。

于 2018-09-09T09:58:25.843 に答える
1

正規表現愛好家のために、私が今までに見つけた最高の (たとえば、RFC 822 と一致する) 電子メールのパターンは次のとおりです (PHP がフィルターを提供する前)。これを Java に変換するのは簡単だと思います - API < 8 で遊んでいる人のために:

private static function email_regex_pattern() {
// Source:  http://www.iamcal.com/publish/articles/php/parsing_email
$qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]';
$dtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]';
$atom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c'.
    '\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+';
$quoted_pair = '\\x5c[\\x00-\\x7f]';
$domain_literal = "\\x5b($dtext|$quoted_pair)*\\x5d";
$quoted_string = "\\x22($qtext|$quoted_pair)*\\x22";
$domain_ref = $atom;
$sub_domain = "($domain_ref|$domain_literal)";
$word = "($atom|$quoted_string)";
$domain = "$sub_domain(\\x2e$sub_domain)*";
$local_part = "$word(\\x2e$word)*";
$pattern = "!^$local_part\\x40$domain$!";
return $pattern ;
}
于 2013-02-28T03:09:46.940 に答える
1

遅すぎることはわかっていますが、それでも答えます。

このコード行を使用して、入力されたEmail形式を確認しました。

!TextUtils.isEmpty(getEmail) && android.util.Patterns.EMAIL_ADDRESS.matcher(getEmail).matches();

FORMAT問題は、 ではなくのみをチェックすることSPELLINGです。

@gmal.com行方不明に入ったときi@yaho.com別の行方不明o。戻りtrueます。の条件を満たしているからですEmail Format

私がしたことは、上記のコードを使用したことです。ユーザーがONLYtrueを入力した場合に与える/返すので、最初はテキストがありません。@gmail.com

フォーマットチェッカー

小切手

このメールを入力すると、次のように表示されます:trueしかしスペルが間違っています。私の中でtextInputLayout error

誤表記

メールアドレス@yahoo.com, @gmail.com,@outlook.com チェッカー

 //CHECK EMAIL
public boolean checkEmailValidity(AppCompatEditText emailFormat){

    String getEmail = emailFormat.getText().toString();
    boolean getEnd;

    //CHECK STARTING STRING IF THE USER
    //entered @gmail.com / @yahoo.com / @outlook.com only
    boolean getResult = !TextUtils.isEmpty(getEmail) && android.util.Patterns.EMAIL_ADDRESS.matcher(getEmail).matches();

    //CHECK THE EMAIL EXTENSION IF IT ENDS CORRECTLY
    if (getEmail.endsWith("@gmail.com") || getEmail.endsWith("@yahoo.com") || getEmail.endsWith("@outlook.com")){
        getEnd = true;
    }else {
        getEnd = false;
    }

    //TEST THE START AND END
    return (getResult && getEnd);
}

戻る:false

間違い

いいえ特別

戻る:true

真実

XML:

<android.support.v7.widget.AppCompatEditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/editTextEmailAddress"
            android:inputType="textEmailAddress|textWebEmailAddress"
            android:cursorVisible="true"
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:singleLine="true"
            android:maxLength="50"
            android:theme="@style/EditTextCustom"/>

value注: EditText からを取得しようとし、そのsplit上で使用しましたStringTokenizer。どちらも私に戻りfalseます。

于 2016-09-25T09:10:31.417 に答える
1

正規表現のほとんどは、国際ドメイン名 (IDN) および .mobi や .info などの新しいトップ レベル ドメイン (国コードまたは .org、.com、.gov などを確認する場合) には有効ではないことに注意してください。

有効なチェックでは、ローカル部分 (アットマークの前) とドメイン部分を分離する必要があります。また、ローカル部分とドメインの最大長 (アットマークを含めて合計 255 文字) も考慮する必要があります。

最善の方法は、アドレスを IDN 互換形式に変換する (必要な場合)、ローカル部分 (RFC) を検証する、アドレスの長さをチェックしてドメインの可用性をチェックする (DNS MX ルックアップ)、または単純に電子メールを送信することです。 .

于 2010-06-21T03:52:48.817 に答える
1

Linkify クラスには、電話番号や電子メール アドレスなどを取得するように設計された正規表現など、関連する可能性のある非常に便利なヘルパー メソッドがいくつかあります。

http://developer.android.com/reference/android/text/util/Linkify.html

于 2011-10-11T11:29:59.237 に答える
1

私は次のコードを使用しました。これはうまく機能します。

if (validMail(yourEmailString)){
   //do your stuf
 }else{
 //email is not valid.
}

次のメソッドを使用します。電子メールが有効な場合、これは true を返します。

    private boolean validMail(String yourEmailString) {
    Pattern emailPattern = Pattern.compile(".+@.+\\.[a-z]+");
    Matcher emailMatcher = emailPattern.matcher(emailstring);
    return emailMatcher.matches();
}
于 2012-03-14T07:19:21.070 に答える
1

email is your email-is.

public boolean validateEmail(String email) {

    Pattern pattern;
    Matcher matcher;
    String EMAIL_PATTERN = "^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
    pattern = Pattern.compile(EMAIL_PATTERN);
    matcher = pattern.matcher(email);
    return matcher.matches();

    }
于 2012-05-28T06:48:26.297 に答える
0

電子メール検証の最も簡単な方法。

EditText TF;
public Button checkButton;

public final Pattern EMAIL_ADDRESS_PATTERN = Pattern.compile(
          "[a-zA-Z0-9+._%-+]{1,256}" +
          "@" +
          "[a-zA-Z0-9][a-zA-Z0-9-]{0,64}" +
          "(" +
          "." +
          "[a-zA-Z0-9][a-zA-Z0-9-]{0,25}" +
          ")+"
      );
 @Override
 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.main);

   TF=(EditText) findViewById(R.id.TF);
   checkButton=(Button) findViewById(R.id.checkButton);

    checkButton.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
           String email=TF.getText().toString();
           if(checkEmail(email))
              Toast.makeText(getApplicationContext(),"Valid Email Addresss", Toast.LENGTH_SHORT).show();
           else
              Toast.makeText(getApplicationContext(),"Invalid Email Addresss", Toast.LENGTH_SHORT).show();
    }
    });
}
private boolean checkEmail(String email) {
    return EMAIL_ADDRESS_PATTERN.matcher(email).matches();
}}
于 2012-03-14T07:00:00.387 に答える