在 Android 中验证电子邮件地址(例如来自用户输入字段)的好技术是什么?org.apache.commons.validator.routines.EmailValidator似乎不可用。是否有任何其他库已经包含在 Android 中,或者我必须使用 RegExp?
36 回答
另一种选择是从 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();
}
下一个模式用于 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
所以你可以用它来验证你的EmailString:
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();
}
科特林功能:
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 也是如此。例程.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 帐户或其他东西。
使用简单的一行代码进行电子邮件验证
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();
}
您可以使用正则表达式来执行此操作。类似于以下内容。
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();
}
包中有一个Patterns
类在android.util
这里是有益的。下面是我一直用来验证电子邮件和许多其他东西的方法
private boolean isEmailValid(String email) {
return !TextUtils.isEmpty(email) && Patterns.EMAIL_ADDRESS.matcher(email).matches();
}
使用扩展函数的最简单的 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()
如果您在 kotlin-multiplatform 中无法访问Pattern
,则等价于:
fun String.isValidEmail() = Regex(emailRegexStr).matches(this)
这是 kotlin 使用扩展功能的最佳方式
fun String.isEmailValid(): Boolean {
return !TextUtils.isEmpty(this) && android.util.Patterns.EMAIL_ADDRESS.matcher(this).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();
}
如果您甚至支持低于 8 的 API 级别,那么您可以简单地将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()
}
试试这个不能接受以数字开头的电子邮件地址的简单方法:
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;
}
试试这个代码..它真的有效..
if (!email
.matches("^[\\w-_\\.+]*[\\w-_\\.]\\@([\\w]+\\.)+[\\w]+[\\w]$"))
{
Toast.makeText(getApplicationContext(), "Email is invalid",
Toast.LENGTH_LONG).show();
return;
}
以下是我使用的。但是,它包含比普通电子邮件更多的字符,但这对我来说是一个要求。
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();
}
这个问题的答案:- 要求验证具有给定点的电子邮件地址
解释-
- (?!.*?..) "Negative Lookhead" 否定 2 个连续的点。
- [A-Za-z0-9.!#\$\%\&\'*+-/\=\?\^_`{\|}\~]+ 至少定义了一个字符。(“\”用于转义)。
- @ 可能有一个“@”。
- [A-Za-z0-9]+ 然后至少定义一个字符。
- [A-Za-z0-9-.]* 定义的字符为零或任何重复。
- [A-Za-z0-9]+ 点后至少一个字符。
这里的关键是您要完全验证电子邮件地址。您不仅要检查它的语法正确性,还要检查电子邮件地址是否真实。
两个明显的原因:真实用户经常输入错误的电子邮件地址,一些用户可能会输入虚假的电子邮件地址。因此,您想要进行语法检查和存在检查。
我在 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 中的电子邮件验证:
val email = etEmail.text.toString().trim() // get email from user
if(isValidEmail(email)){ // call isValidEmail function and pass email in parameter
// Your email ID is Valid
}else{
// Enter your valid email ID
}
此方法用于检查有效的电子邮件 ID 格式。
fun isValidEmail(email: CharSequence): Boolean {
var isValid = true
val expression = "^[\\w.-]+@([\\w\\-]+\\.)+[A-Z]{2,4}$"
val pattern = Pattern.compile(expression, Pattern.CASE_INSENSITIVE)
val matcher = pattern.matcher(email)
if (!matcher.matches()) {
isValid = false
}
return isValid
}
请注意,大多数正则表达式对于国际域名 (IDN) 和 .mobi 或 .info 等新顶级域(如果您检查国家代码或 .org、.com、.gov 等)无效。
有效的检查应该将本地部分(在 at 符号之前)和域部分分开。您还应该考虑本地部分和域的最大长度(总共 255 个字符,包括 at 符号)。
最好的方法是将地址转换为与 IDN 兼容的格式(如果需要)、验证本地部分 (RFC)、检查地址的长度并检查域的可用性(DNS MX 查找)或简单地发送电子邮件.
Linkify 类有一些可能相关的非常有用的辅助方法,包括用于获取电话号码和电子邮件地址等的正则表达式:
http://developer.android.com/reference/android/text/util/Linkify.html
我使用了以下代码。这很有效。我希望这会对你有所帮助。
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();
}
电子邮件是您的电子邮件。
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));
}
}
}
}
你也可以使用
InternetAddress emailAddr = new InternetAddress(email);
emailAddr.validate();
如果电子邮件无效,它将抛出AddressException。
不幸的是,Android不支持 jndi-dns,但只是为了让您了解更强大的电子邮件验证,您可以使用它来验证电子邮件域。也许 Android 大师可以提供帮助并展示是否有类似的替代方案......这里提供了一个“常规”java 的示例实现。
编辑
我刚刚意识到 javax.mail 也不支持...但是这篇文章显示了一种解决方法。
我知道这已经太晚了,我仍然会给出我的答案。
我使用这行代码来检查输入的Email
格式:
!TextUtils.isEmpty(getEmail) && android.util.Patterns.EMAIL_ADDRESS.matcher(getEmail).matches();
问题是,它只会检查FORMAT
not SPELLING
。
当我进入@gmal.com
失踪i
,又@yaho.com
错过另一个o
。它返回true
。因为它满足 的条件Email Format
。
我所做的是,我使用了上面的代码。true
因为如果用户输入@gmail.com
ONLY ,它将给出/返回,开始时没有文本。
格式检查器
如果我输入这封电子邮件,它会给我:true
但拼写错误。在我的textInputLayout error
电子邮件地址@yahoo.com
, @gmail.com
,@outlook.com
检查器
//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"/>
注意:我试图value
从 EditText 获取并使用split
它,甚至StringTokenizer
. 两者都回到false
我身边。
根据 Patterns.EMAIL_ADDRESS,这封电子邮件是正确的“abc@abc.c”。所以我修改了 Patterns.EMAIL_ADDRESS 中的正则表达式并增加了域的最小长度。这是 Kotlin 的功能:
fun isEmailValid(email: String): Boolean =
email.isNotEmpty() && 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\\-]{1,25}" +
")+"
).matcher(email).matches()
我刚刚将域部分从 {0,25} 更改为 {1,25}。
电子邮件验证的最简单方法。
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();
}}
Kotlin 扩展函数
fun EditText.isValidEmail() : Boolean{
return if(Pattern
.compile("^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$")
.matcher(text.toString()).matches()){
true
}else {
hint = context.getString(R.string.invalid_email_adress)
false
}
}
采用
if(!emailEt.isValidEmail()){
return
}