在Android的EditText中进行电子邮件地址验证

245

我们如何在 Android 上对 edittext 进行 电子邮件验证?我已经查阅了 Google 和 SO,但我没有找到一个简单的方法来验证它。


24
android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches();这段代码的作用是检查一个字符串是否符合电子邮件地址的格式。 - Pratik Butani
9个回答

798

Java:

public static boolean isValidEmail(CharSequence target) {
    return (!TextUtils.isEmpty(target) && Patterns.EMAIL_ADDRESS.matcher(target).matches());
}

Kotlin:

fun CharSequence?.isValidEmail() = !isNullOrEmpty() && Patterns.EMAIL_ADDRESS.matcher(this).matches()

编辑:它将在Android 2.2及以上版本中运行!

编辑:添加丢失的;


71
使用内置函数是一个不错的选择,我还会将 target == null 替换为 TextUtils.isEmpty(target) - rciovati
24
一行代码解决方案:return !TextUtils.isEmpty(target) && Patterns.EMAIL_ADDRESS.matcher(target).matches(); (该代码用于判断目标字符串是否为有效的电子邮件地址) - Madan Sapkota
3
这个内置的模式不完整,比如说"a@a."会通过。请参考这个问题,获取一个“大多数情况下足够好”的符合RFC822标准的答案。 - MPelletier
6
boolean result = !TextUtils.isEmpty(target) && android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches(); - Faisal Naseer
5
@MPelletier 好的,我亲自测试了一下,“a@a.”不会通过。 - HendraWD
显示剩余9条评论

89

进行电子邮件验证有许多方法,但最简单、最容易的方法是两种方法

1- 使用 EditText(....).addTextChangedListener,它会在 EditText框 中的每个输入上触发,即email_id是否有效

/**
 * Email Validation ex:- tech@end.com
*/


final EditText emailValidate = (EditText)findViewById(R.id.textMessage); 

final TextView textView = (TextView)findViewById(R.id.text); 

String email = emailValidate.getText().toString().trim();

String emailPattern = "[a-zA-Z0-9._-]+@[a-z]+\\.+[a-z]+";

emailValidate .addTextChangedListener(new TextWatcher() { 
    public void afterTextChanged(Editable s) { 

    if (email.matches(emailPattern) && s.length() > 0)
        { 
            Toast.makeText(getApplicationContext(),"valid email address",Toast.LENGTH_SHORT).show();
            // or
            textView.setText("valid email");
        }
        else
        {
             Toast.makeText(getApplicationContext(),"Invalid email address",Toast.LENGTH_SHORT).show();
            //or
            textView.setText("invalid email");
        }
    } 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    // other stuffs 
    } 
    public void onTextChanged(CharSequence s, int start, int before, int count) {
    // other stuffs 
    } 
}); 

2- 使用if-else条件语句的最简单方法。使用getText()获取EditText框中的字符串,并将其与提供的电子邮件模式进行比较。如果模式不匹配或匹配,点击按钮时会弹出一个消息提示框。它不会在每个字符输入到EditText框中时触发,下面是一个简单的示例。

final EditText emailValidate = (EditText)findViewById(R.id.textMessage); 

final TextView textView = (TextView)findViewById(R.id.text); 

String email = emailValidate.getText().toString().trim();

String emailPattern = "[a-zA-Z0-9._-]+@[a-z]+\\.+[a-z]+";

// onClick of button perform this simplest code.
if (email.matches(emailPattern))
{
Toast.makeText(getApplicationContext(),"valid email address",Toast.LENGTH_SHORT).show();
}
else 
{
Toast.makeText(getApplicationContext(),"Invalid email address", Toast.LENGTH_SHORT).show();
}

1
第二个简单而好...非常感谢。 - Srihari
2
此为无效的电子邮件模式。在test_04@yahoo.co.in上测试失败。 - Jijo Thomas
@JijoThomas 谢谢。 - Rahul Baradia
1
无法使用电子邮件"contact@yehipay.co.in"。 - Basant

45

我是这样做的:

添加这个方法检查电子邮件地址是否有效

private boolean isValidEmailId(String email){

    return Pattern.compile("^(([\\w-]+\\.)+[\\w-]+|([a-zA-Z]{1}|[\\w-]{2,}))@"
              + "((([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\\.([0-1]?"
              + "[0-9]{1,2}|25[0-5]|2[0-4][0-9])\\."
              + "([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\\.([0-1]?"
              + "[0-9]{1,2}|25[0-5]|2[0-4][0-9])){1}|"
              + "([a-zA-Z]+[\\w-]+\\.)+[a-zA-Z]{2,4})$").matcher(email).matches();
     }

现在使用EditTextString进行检查:

if(isValidEmailId(edtEmailId.getText().toString().trim())){
  Toast.makeText(getApplicationContext(), "Valid Email Address.", Toast.LENGTH_SHORT).show();
}else{       
  Toast.makeText(getApplicationContext(), "InValid Email Address.", Toast.LENGTH_SHORT).show();
}

完成


这个对我有效,因为它接受"user@gmail.com.ph"。 - no_profile

40

使用此方法验证电子邮件格式。将电子邮件作为字符串传递,如果格式正确,则返回 true;否则返回 false。

/**
 * validate your email address format. Ex-akhi@mani.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();
}

1
这对我来说是最重要的。 - martinseal1987
1
标记为无效的是 "plainaddress"、"@domain.com"、"あいうえお@domain.com"、"email@domain"、"email@111.222.333.44444"、"email@domain..com"。 - martinseal1987

12

尝试这个:

if (!emailRegistration.matches("[a-zA-Z0-9._-]+@[a-z]+\.[a-z]+")) {
 editTextEmail.setError("Invalid Email Address");
}

2
这种方法无法处理包含多个点的电子邮件地址,例如a@woof.co.za。同时也会匹配没有点的电子邮件地址,例如name@gmailcom。 - Matiaan
好的,已经修复了你的正则表达式,现在包括了字面上的点而不是“接受任何字符”的点。 - zombiesauce

10
public static boolean isEmailValid(String email) {
    boolean isValid = false;

    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()) {
        isValid = true;
    }
    return isValid;
}

这对我来说完美地运作了,也许表达方式有所不同。 - Sagar G.

9
使用此方法验证电子邮件:
 public static boolean isEditTextContainEmail(EditText argEditText) {

            try {
                Pattern pattern = Pattern.compile("^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$");
                Matcher matcher = pattern.matcher(argEditText.getText());
                return matcher.matches();
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }

如果你有任何疑问,请告诉我。


6

这是我创建的一个样例方法,用于验证电子邮件地址。如果传递的字符串参数是有效的电子邮件地址,则返回true,否则返回false。

private boolean validateEmailAddress(String emailAddress){
    String  expression="^[\\w\\-]([\\.\\w])+[\\w]+@([\\w\\-]+\\.)+[A-Z]{2,4}$";  
       CharSequence inputStr = emailAddress;  
       Pattern pattern = Pattern.compile(expression,Pattern.CASE_INSENSITIVE);  
       Matcher matcher = pattern.matcher(inputStr);  
       return matcher.matches();
}

6

试试这个

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

在编辑文本中

final String emailText = email.getText().toString();
EMAIL_ADDRESS_PATTERN.matcher(emailText).matches()

这是Android模式,并接受5125945@12.2121。您对此情况有任何解决方案吗? - Amarjit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接