在Android中验证电子邮件地址(例如来自用户输入字段)的好技术是什么?org.apache.commons.validator.routines.EmailValidator似乎不可用。是否有其他库已包含在Android中,或者我必须使用RegExp?
在Android中验证电子邮件地址(例如来自用户输入字段)的好技术是什么?org.apache.commons.validator.routines.EmailValidator似乎不可用。是否有其他库已包含在Android中,或者我必须使用RegExp?
Answers:
不要使用正则表达式。
显然,以下是一个正则表达式,可以正确地验证大多数符合RFC 2822的电子邮件地址(并且在org.apache.commons.validator之类的“ user@gmail.com.nospam”之类的消息上仍然会失败。例程.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帐户或类似名称。
user@gmail.com.nospam
,甚至是更长的.lds等tlds。我想念什么吗?我不想通过不验证他们的有效电子邮件地址来阻止我的任何用户,但这似乎可以解决我想到的任何问题。
另一个选项是从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的一种解决方案:
public final static boolean isValidEmail(CharSequence target) {
return !TextUtils.isEmpty(target) && android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches();
}
(target == null)
用TextUtils.isEmpty(target)
:)
email@111.222.333.44444
为有效的电子邮件
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();
}
android.util.Patterns.EMAIL_ADDRESS
?
[a-zA-Z0-9+._%-]
,其他为[a-zA-Z0-9-]
i
从@gmail.com
它会返回true。在@@ hoho.com中也是如此。
从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兼容。
我们现在有简单的电子邮件模式匹配器
private static boolean isValidEmail(String email) {
return !TextUtils.isEmpty(email) && android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches();
}
使用简单的一行代码进行电子邮件验证
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 Studio的建议:
public static boolean isEmailValid(String email) {
return !(email == null || TextUtils.isEmpty(email)) && android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches();
}
email == null
由于TextUtils对其进行了内部检查,因此再次取消了空检查
您可以使用正则表达式来执行此操作。类似于以下内容。
Pattern pattern = Pattern.compile(".+@.+\\.[a-z]+");
String email = "xyz@xyzdomain.com";
Matcher matcher = pattern.matcher(email);
boolean matchFound = matcher.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();
}
您可以这样编写Kotlin扩展:
fun String.isValidEmail() =
this.isNotEmpty() && android.util.Patterns.EMAIL_ADDRESS.matcher(this).matches()
然后这样称呼它:
email.isValidEmail()
Patterns
程序包中有一个类在android.util
这里是有益的。以下是我一直用于验证电子邮件和许多其他内容的方法
private boolean isEmailValid(String email) {
return !TextUtils.isEmpty(email) && Patterns.EMAIL_ADDRESS.matcher(email).matches();
}
在要验证电子邮件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;
}
}
为了进行电子邮件验证,Android提供了一些InBuilt模式。但是它仅支持API级别8和更高版本。
这是使用该模式检查电子邮件验证的代码。
private boolean Email_Validate(String email)
{
return android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches();
}
确保执行此方法后,应检查此方法是否返回true,然后才允许保存电子邮件,以及此方法返回false则显示电子邮件为“无效”的消息。
希望你能得到答案,谢谢。
我可以强烈建议您不要尝试“验证”电子邮件地址,因为没有充分的理由,您只会从事很多工作。
只要确保输入的内容不会破坏您自己的代码即可-例如,没有空格或非法字符可能会导致异常。
其他任何事情都会使您付出很多工作,而回报却最小。
验证您的电子邮件地址格式。前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();
}
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;
}
如果您使用的是API 8或更高版本,则可以使用现成的Patterns
类来验证电子邮件。样例代码:
public final static boolean isValidEmail(CharSequence target) {
if (target == null)
return false;
return android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches();
}
如果您偶然支持的API级别小于8,那么您只需将Patterns.java
文件复制到项目中并引用它即可。您可以Patterns.java
从此链接获取源代码
这是 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, -)
示例一些特殊匹配的电子邮件
a@b.c
a+@b-.c
a@b.c.d.e.f.g.h
您可以根据情况修改此模式,然后通过
fun isValidEmail(email: String): Boolean {
return Patterns.EMAIL_ADDRESS.matcher(email).matches()
}
以下是我使用的。但是,它包含比普通电子邮件更多的字符,但这对我来说是必需的。
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();
}
这个问题的答案:- 要求验证具有给定积分的电子邮件地址
说明-
这里的关键是您要完全验证电子邮件地址。您不仅要检查语法正确性,还想检查电子邮件地址是否真实。
有两个明显的原因:实际用户经常错误输入电子邮件地址,以及某些用户可能会输入伪造的电子邮件地址。因此,您要进行语法检查和存在检查。
我在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中的电子邮件地址。
使用扩展功能的最简单的Kotlin解决方案:
fun String.isEmailValid() =
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}" +
")+"
).matcher(this).matches()
然后您可以像这样验证:
"testemail6589@gmail.com".isEmailValid()
Linkify类具有一些可能有用的非常有用的帮助程序方法,包括用于获取电话号码和电子邮件地址的正则表达式,例如:
http://developer.android.com/reference/android/text/util/Linkify.html
我使用了下面的代码,这很奏效,希望对您有所帮助。
if (validMail(yourEmailString)){
//do your stuf
}else{
//email is not valid.
}
并使用follwing方法。如果电子邮件有效,则返回true。
private boolean validMail(String yourEmailString) {
Pattern emailPattern = Pattern.compile(".+@.+\\.[a-z]+");
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();
}
对于正则表达式爱好者来说,自从现在以来我发现最好的电子邮件模式(例如,与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 ;
}
您可以通过椭圆形的.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));
}
}
}
}