我应该如何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
返回: 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(); }}
- 在FormsAuthentication.SignOut()之后,Page.User.Identity.IsAuthenticated仍然为true。
- WPF数据绑定和validation规则最佳实践
- MVC3删除ModelState错误
- 使用JQueryvalidation插件validation具有相同名称的多个表单字段
- 什么是REST API服务返回validation失败的合适的HTTP状态码?
- 没有身份可用于签署Xcode 5
- 检查inputstring是否包含javascript中的数字
- 如何将我的DDD模型中的“用户”与validation用户进行集成?
- Asp.netformsauthentication和多个域