Androidで電子メールアドレスを検証するための(たとえば、ユーザー入力フィールドからの)良いテクニックは何ですか? org.Apache.commons.validator.routines.EmailValidator は利用できないようです。 Androidに既に含まれている他のライブラリがありますか、それともRegExpを使用する必要がありますか。
正規表現を使用しないでください。
どうやら、以下は RFC 2822 に準拠するほとんどの電子メールアドレスを正しく検証するreg-exです。 .Apache.commons.validator.routines.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])+)\])
指定されたアドレスに確認Eメールを送信するだけでEメールを検証し、それがバウンスしてから無効になる可能性が最も簡単な方法です。
いくつかの基本的なチェックを実行したい場合は、単に*@*
の形式であることをチェックできます。
ビジネスロジック固有の検証がある場合は、正規表現を使用してそれを実行できます。 gmail.comアカウントか何かでなければなりません。
もう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();
}
次のパターンはK-9メールで使われています:
public static 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}" +
")+"
);
機能が使えます
private boolean checkEmail(String email) {
return EMAIL_ADDRESS_PATTERN.matcher(email).matches();
}
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}" +
")+"
);
そのため、API <8との互換性のために自分でそれを構築することができます。
今は簡単なメールパターンマッチャーがあります
private static boolean isValidEmail(String email) {
return !TextUtils.isEmpty(email) && Android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches();
}
これはAndroid Studioの提案です。
public static boolean isEmailValid(String email) {
return !(email == null || TextUtils.isEmpty(email)) && Android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches();
}
電子メールの検証に単純な1行のコードを使用する
public static boolean isValidEmail(CharSequence target) {
return !TextUtils.isEmpty(target) && Android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches();
}
のように使用してください...
if (!isValidEmail(yourEdittext.getText().toString()) {
Toast.makeText(context, "your email is not valid", 2000).show();
}
以下のように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();
}
そうするために正規表現を使うことができます。次のようなもの。
Pattern pattern = Pattern.compile(".+@.+\\.[a-z]+");
String email = "[email protected]";
Matcher matcher = pattern.matcher(email);
boolean matchFound = matcher.matches();
注:上記の正規表現を確認してください。そのまま使用しないでください。
ここで有益なパッケージAndroid.util
にPatterns
クラスがあります。以下は私がEメールや他の多くのものを検証するためにいつも使う方法です。
private boolean isEmailValid(String email) {
return !TextUtils.isEmpty(email) && Patterns.EMAIL_ADDRESS.matcher(email).matches();
}
Eメールの検証用にAndroidはいくつかの InBuilt Pattern を提供していますが、それはAPIレベル8以上のみをサポートしています。
これは、電子メールの検証を確認するためにそのパターンを使用するためのコードです。
private boolean Email_Validate(String email)
{
return Android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches();
}
このメソッドを実行した後、このメソッドが返ってきたらtrueならメールを保存できることを確認し、このメソッドが返ったらfalseならメールは "無効です"というメッセージを表示する".
あなたがあなたの答えを得られることを願っています、ありがとう。
あなたはこのようなKotlin拡張を書くことができます:
fun String.isValidEmail() =
this.isNotEmpty() && Android.util.Patterns.EMAIL_ADDRESS.matcher(this).matches()
そしてそれを次のように呼びます。
email.isValidEmail()
EメールIDを検証したい場所でこのメソッドを呼び出します。
public static boolean isValid(String email)
{
String expression = "^[\\w\\.-]+@([\\w\\-]+\\.)+[A-Z]{2,4}$";
CharSequence inputStr = email;
Pattern pattern = Pattern.compile(expression, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(inputStr);
if (matcher.matches())
{
return true;
}
else{
return false;
}
}
メールアドレスの形式を確認してください。 [email protected]
public boolean emailValidator(String email)
{
Pattern pattern;
Matcher matcher;
final 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();
}
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;
}
私はあなたがEメールアドレスを「検証」しようとしないことを強く推奨することができます、あなたはただ正当な理由もなく多くの仕事に自分自身を入れるでしょう。
入力したものが自分のコードを壊さないようにしてください。例外を引き起こす可能性のあるスペースや不正な文字は使用できません。
他に何かをするだけで最小限の収益のためにあなたに多くの仕事を引き起こすでしょう...
これはAndroid.util.Patterns.EMAIL_ADDRESS
です
[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})+
String
は次の場合に一致します。
Start by 1->256 character in (a-z, A-Z, 0-9, +, ., _, %, - , +)
then 1 '@' character
then 1 character in (a-z, A-Z, 0-9)
then 0->64 character in (a-z, A-Z, 0-9, -)
then **ONE OR MORE**
1 '.' character
then 1 character in (a-z, A-Z, 0-9)
then 0->25 character in (a-z, A-Z, 0-9, -)
いくつかの特別一致メールの例
[email protected]
[email protected]
[email protected]
あなたはあなたのケースのためにこのパターンを修正してから検証することができます
fun isValidEmail(email: String): Boolean {
return Patterns.EMAIL_ADDRESS.matcher(email).matches()
}
数字で始まるEメールアドレスを受け入れられないこの簡単な方法を試してください。
boolean checkEmailCorrect(String Email) {
if(signupEmail.length() == 0) {
return false;
}
String pttn = "^\\D.+@.+\\.[a-z]+";
Pattern p = Pattern.compile(pttn);
Matcher m = p.matcher(Email);
if(m.matches()) {
return true;
}
return false;
}
API 8以上を使用している場合は、すぐに利用可能なPatterns
クラスを使用して電子メールを検証できます。サンプルコード
public final static boolean isValidEmail(CharSequence target) {
if (target == null)
return false;
return Android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches();
}
偶然にも8未満のAPIレベルをサポートしているのであれば、Patterns.Java
ファイルをプロジェクトにコピーしてそれを参照するだけです。 Patterns.Java
のソースコードは、このリンクから入手できます
ここで重要なのは、あなたが完全にEメールアドレスを検証したいということです。文法上の正確さをチェックするだけではなく、メールアドレスが本物かどうかをチェックします。
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. \"[email protected]\". 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で電子メールアドレスを検証できるため、非常に優れています。
このコードを試してみてください。
if (!email
.matches("^[\\w-_\\.+]*[\\w-_\\.]\\@([\\w]+\\.)+[\\w]+[\\w]$"))
{
Toast.makeText(getApplicationContext(), "Email is invalid",
Toast.LENGTH_LONG).show();
return;
}
Linkifyクラスには、電話番号や電子メールアドレスなどをピックアップするように設計された正規表現など、関連性があると思われる非常に便利なヘルパーメソッドがいくつかあります。
http://developer.Android.com/reference/Android/text/util/Linkify.html
ほとんどの正規表現は、国際ドメイン名(IDN)および.mobiや.infoのような新しいトップレベルドメインには無効です(国コードまたは.org、.com、.govなどをチェックする場合)。
有効なチェックは、(アットマークの前の)ローカル部分とドメイン部分を分離する必要があります。ローカル部分とドメインの最大長も考慮する必要があります(アットマークを含めて合計255文字)。
最善の方法は、アドレスをIDN互換形式に変換し(必要な場合)、ローカル部分(RFC)を検証し、アドレスの長さを調べ、ドメインの可用性を確認する(DNS MXルックアップ)か、単に電子メールを送信することです。 。
eメールはあなたのEメールです。
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();
}
私はそれが遅すぎることを知っています、それでも私は私の答えを与えます。
このコード行を使用して、入力されたEmail
の形式を確認しました。
!TextUtils.isEmpty(getEmail) && Android.util.Patterns.EMAIL_ADDRESS.matcher(getEmail).matches();
問題は、FORMAT
ではなくSPELLING
のみをチェックすることです。
@gmal.com
にi
がなく、@yaho.com
に別のo
がありません。 true
を返します。それはEmail Format
の条件を満たしているからです。
私がやったことは、私は上記のコードを使用しました。ユーザーが@gmail.com
ONLYを入力した場合はtrue
を返す/返すので、先頭にテキストはありません。
フォーマットチェッカー
このメールアドレスを入力すると、true
と表示されますが、スペルが間違っています。私のtextInputLayout error
に
メールアドレス@yahoo.com
、@gmail.com
、@Outlook.com
CHECKER
//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"/>
注:私はEditTextからvalue
を取得しようとし、それにsplit
、さらにはStringTokenizer
を使用しました。両方とも私にfalse
を返します。
あなたはoval.jarファイルによって非常に簡単にAndroidでどんな種類の検証もすることができます。 OValは、あらゆる種類のJavaオブジェクト用の実用的で拡張可能な汎用検証フレームワークです。
このリンクをたどってください: http://oval.sourceforge.net/userguide.html
あなたはここからこれをダウンロードすることができます: http://oval.sourceforge.net/userguide.html#download
変数にタグを設定することで検証を使用できます
public class Something{
@NotEmpty //not empty validation
@Email //email validation
@SerializedName("emailAddress")
private String emailAddress;
}
private void checkValidation() {
Something forgotpass.setEmailAddress(LoginActivity.this.dialog_email.getText().toString());
Validator validator = new Validator();
//collect the constraint violations
List<ConstraintViolation> violations = validator.validate(forgotpass);
if(violations.size()>0){
for (ConstraintViolation cv : violations){
if(cv.getMessage().contains("emailAddress")){
dialog_email.setError(ValidationMessage.formattedError(cv.getMessage(), forgotpass));
}
}
}
}
あなたも使うことができます
InternetAddress emailAddr = new InternetAddress(email);
emailAddr.validate();
電子メールが無効な場合は、AddressExceptionがスローされます。
残念ながらAndroid サポートしていませんjndi-dns ですが、より強力なEメール検証のアイデアを与えるために、Eメールドメインを検証するためにそれを使用することができます。たぶんAndroidの第一人者が同様の代替手段があるかどうかを助けて示すことができます... "通常の" Javaを使った実装例 ここで利用可能です 。
編集
私はただjavax.mailがどちらもサポートしていないことに気付きました...しかし、この記事は 回避策 を示しています。
私は以下のコードを使いました。
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();
}
正規表現を愛する人にとって、私が今までに見つけた中で最高の(たとえばRFC 822に準拠した)Eメールのパターンは次のとおりです(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 ;
}
以下が私によって使われました。しかし、通常のEメールよりも余分な文字が含まれていますが、これは私にとっての要件でした。
public boolean isValidEmail(String inputString) {
String s ="^((?!.*?\.\.)[A-Za-z0-9\.\!\#\$\%\&\'*\+\-\/\=\?\^_`\{\|\}\~]+@[A-Za-z0-9]+[A-Za-z0-9\-\.]+\.[A-Za-z0-9\-\.]+[A-Za-z0-9]+)$";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(inputString);
return matcher.matches();
}
この質問の回答: - 与えられたポイントで電子メールアドレスを検証するための要件
説明-