我应该如何validation电子邮件地址?

Android中用于validation电子邮件地址(例如,来自用户input字段)的好技术是什么? org.apache.commons.validator.routines.EmailValidator似乎不可用。 有没有其他的图书馆这样做已经包含在Android中,或者我将不得不使用RegExp?

不要使用reg-ex。

很明显,以下是一个reg-ex,能够正确validation符合RFC 2822的大多数电子邮件地址,并且仍然会像org.apache.commons.validator一样在“user@gmail.com.nospam”上失败。 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])+)\]) 

可能最简单的方法来validation电子邮件只发送一个确认电子邮件提供的地址,它弹跳,那么它是无效的。

如果你想执行一些基本的检查,你可以检查它的forms*@*

如果你有一些业务逻辑具体validation,那么你可以使用正则expression式,例如必须是一个gmail.com帐户或其他东西。

另一种select是从API Level 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提供的一行解决scheme:

 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}" + ")+" ); 

你可以使用function

 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

所以你可以用它来validationyourEmailString:

 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

所以你可以自己构build它来兼容API <8。

我们现在有简单的电子邮件模式匹配器

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

这是Android Studio的build议:

 public static boolean isEmailValid(String email) { return !(email == null || TextUtils.isEmpty(email)) && android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches(); } 

使用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(); } 

你可以使用正则expression式来做到这一点。 像下面这样。

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

注意:检查上面给出的正则expression式,不要照原样使用它。

使用简单的一行代码进行电子邮件validation

 public final 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(); } 

调用此方法您要validation电子邮件ID。

 public static boolean isValid(String email) { String expression = "^[\\w\\.-]+@([\\w\\-]+\\.)+[AZ]{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; } } 

对于一个电子邮件validationandroid提供了一些InBuilt模式,但它只支持API级别8及以上

这里是使用该模式来检查电子邮件validation的代码。

  private boolean Email_Validate(String email) { return android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches(); } 

确保执行这个方法后,你应该检查,如果这个方法返回true,那么你允许保存电子邮件,如果这个方法返回false然后显示消息,该电子邮件是“无效”。

希望你能得到你的答案,谢谢。

validation您的电子邮件地址格式。 Ex-virag@gmail.com

 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(); } 

我可以强烈build议你不要试图“validation”电子邮件地址,你只是让自己很多工作没有很好的理由。

只要确保input的内容不会破坏你自己的代码 – 例如没有可能导致exception的空格或非法字符。

其他任何事情只会给你很大的工作,以最小的回报…

  public boolean isValidEmail(String email) { boolean isValidEmail = false; String emailExpression = "^[\\w\\.-]+@([\\w\\-]+\\.)+[AZ]{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; } 

试试这个代码..它真的有用..

  if (!email .matches("^[\\w-_\\.+]*[\\w-_\\.]\\@([\\w]+\\.)+[\\w]+[\\w]$")) { Toast.makeText(getApplicationContext(), "Email is invalid", Toast.LENGTH_LONG).show(); return; } 

请注意,大部分正则expression式对于国际域名(IDN)和新的顶级域名如.mobi或.info(如果您检查国家/地区代码或.org,.com,.gov等)无效。

有效的检查应该将本地部分(在签署之前)和域部分分开。 您还应该考虑本地部分和域的最大长度(总计255个字符,包括at-sign)。

最好的方法是以IDN兼容格式(如果需要)转换地址,validation本地部分(RFC),检查地址的长度并检查域的可用性(DNS MX查找),或只发送电子邮件。

试试这个简单的方法,不能接受以数字开头的电子邮件地址:

 boolean checkEmailCorrect(String Email) { if(signupEmail.length() == 0) { return false; } String pttn = "^\\D.+@.+\\.[az]+"; Pattern p = Pattern.compile(pttn); Matcher m = p.matcher(Email); if(m.matches()) { return true; } return false; } 

Linkify类有一些非常有用的帮助器方法,可能是相关的,包括用于提取电话号码和电子邮件地址的正则expression式等:

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

我已经使用follwing代码。这工作grate.I希望这会帮助你。

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

并使用follwing方法。如果电子邮件有效,则返回true。

  private boolean validMail(String yourEmailString) { Pattern emailPattern = Pattern.compile(".+@.+\\.[az]+"); Matcher emailMatcher = emailPattern.matcher(emailstring); return emailMatcher.matches(); } 

电子邮件是你的电子邮件是。

 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(); } 

对于正则expression式爱好者来说,从现在开始我发现的最好的(例如,与RFC 822一致的)电子邮件模式是以下的(在PHP提供的filter之前)。 我想这很容易翻译成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 ; } 

您可以通过oval.jar文件非常轻松地在android中进行任何types的validation。 OVal是任何一种Java对象的实用且可扩展的通用validation框架。

请按照此链接: http : //oval.sourceforge.net/userguide.html

你可以从这里下载: http : //oval.sourceforge.net/userguide.html#download

您可以通过在variables中设置标签来使用validation

 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(); 

如果电子邮件无效,则会抛出AddressExceptionexception

不幸的是,Android 不支持 jndi-dns ,只是为了给你一个更强大的电子邮件validation的想法,你可以用它来validation电子邮件域。 也许一个Android大师可以帮助并显示是否有类似的select…一个示例实现“常规”Java 可在这里 。

编辑

我只是意识到,javax.mail不支持…但是这个post显示了一个解决方法 。

我知道现在已经太晚了,我仍然会回答。

我使用这行代码来检查input的Email格式:

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

问题是,它只会检查FORMAT而不是SPELLING

当我input@gmal.com失踪i ,和@yaho.com错过了另一个o 。 它返回true 。 由于它符合Email Format的条件。

我所做的是,我使用了上面的代码。 因为如果用户input@gmail.com ,它会给/返回true ,在开始时没有文本。

FORMAT CHECKER

查

如果我input这个电子邮件,它会给我: 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); } 

RETURN: false

假

noSpecial

返回: 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 。 两者都回报我。

如果您使用API​​ 8或更高版本,则可以使用随时可用的Patterns类来validation电子邮件。 示例代码:

 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的源代码

android.util有一个Patterns类,在这里很有用。 下面是我总是用来validation电子邮件和其他许多东西的方法

 private boolean isEmailValid(String email) { return !TextUtils.isEmpty(email) && Patterns.EMAIL_ADDRESS.matcher(email).matches(); } 

最简单的电子邮件validation方式。

 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(); }}