在Android中,验证电子邮件地址(例如来自用户输入字段)的好技术是什么? org.apache.commons.validator.routines.EmailValidator 似乎不可用。是否已经包含了其他执行此操作的库或者我需要使用RegExp?
在Android中,验证电子邮件地址(例如来自用户输入字段)的好技术是什么? org.apache.commons.validator.routines.EmailValidator 似乎不可用。是否已经包含了其他执行此操作的库或者我需要使用RegExp?
另一个选项是从API Level 8开始内置的Patterns:
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();
}
TextUtils.isEmpty(target)
替换 (target == null)
:) - Houcineemail@111.222.333.44444
视为有效的电子邮件地址。 - Joaquin Iurchuk下一个模式用于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
? - Sergey Metlov[a-zA-Z0-9+._%-]
,其他类简化为[a-zA-Z0-9-]
。 - Robinprivate boolean isValidEmail(String email) {
Pattern pattern = Patterns.EMAIL_ADDRESS;
return pattern.matcher(email).matches();
}
如果电子邮件地址有效,则返回true。
更新: 此模式源代码为:
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兼容。
我们现在拥有一个简单的电子邮件模式匹配器。
Java:
private static boolean isValidEmail(String email) {
return !TextUtils.isEmpty(email) && android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches();
}
Kotlin函数:
private fun isValidEmail(email: String): Boolean {
return !TextUtils.isEmpty(email) && Patterns.EMAIL_ADDRESS.matcher(email).matches()
}
Kotlin 扩展:
fun String.isValidEmail() =
!TextUtils.isEmpty(this) && Patterns.EMAIL_ADDRESS.matcher(this).matches()
不要使用正则表达式。
显然,以下是一个正则表达式,它能正确验证符合RFC 2822标准的大多数电子邮件地址(但仍会失败于像"user@gmail.com.nospam"这样的地址,也和org.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])+)\])
验证电子邮件地址可能最简单的方法是向提供的地址发送确认电子邮件,如果它被退回,那么它就是无效的。
如果您想执行一些基本检查,您可以仅检查它是否符合*@*
的形式。
如果您有一些特定业务逻辑的验证要求,则可以使用正则表达式来执行该操作,例如必须是gmail.com帐户之类的东西。
user@gmail.com.nospam
甚至更长的域名后缀(TLD)例如 .museum。我错过了什么吗?我不想因未能验证用户有效电子邮件地址而阻止他们使用我的服务,但这个正则表达式似乎对我能想到的所有东西都有效。 - Bob Vork使用简单的一行代码进行电子邮件验证
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();
}
您可以编写如下所示的 Kotlin 扩展:
fun String.isValidEmail() =
isNotEmpty() && android.util.Patterns.EMAIL_ADDRESS.matcher(this).matches()
然后像这样调用它:
email.isValidEmail()
这是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会在内部检查它。 - Volodymyr使用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 = "xyz@xyzdomain.com";
Matcher matcher = pattern.matcher(email);
boolean matchFound = matcher.matches();
注意:检查上面给出的正则表达式,不要直接使用它。“Example Guy”<guy@example.com>
将导致此验证失败。虽然从技术上讲,你可以使用正则表达式验证电子邮件地址,但这样做有点荒谬。 - Cory Petosky
if(!Patterns.EMAIL_ADDRESS.matcher(editTextEmail.getText().toString()).matches()){ //show toast:enter valid email }
- AG-Developer