Validate an email inside an EditText
我想验证在EditText中引入的一封电子邮件,这是我已经拥有的代码:
final EditText textMessage = (EditText)findViewById(R.id.textMessage);
final TextView text = (TextView)findViewById(R.id.text);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | textMessage.addTextChangedListener(new TextWatcher() { public void afterTextChanged(Editable s) { if (textMessage.getText().toString().matches("[a-zA-Z0-9._-]+@[a-z]+.[a-z]+") && s.length() > 0) { text.setText("valid email"); } else { text.setText("invalid email"); } } public void beforeTextChanged(CharSequence s, int start, int count, int after) {} public void onTextChanged(CharSequence s, int start, int before, int count) {} }); |
问题是,当我在" @"之后引入3个字符时,会出现消息"有效电子邮件",而当我引入完整的电子邮件时必须出现该消息。
有什么建议吗?
谢谢你们!
只需如下更改正则表达式:
1 | "[a-zA-Z0-9._-]+@[a-z]+\\\\.+[a-z]+" |
因为。点(dot)表示匹配任何单字符,在点之前加双反斜杠代表真实的点。
我编写了一个扩展EditText的库,该库本身支持某些验证方法,并且实际上非常灵活。
如我所写,当前本地支持的(通过xml属性)验证方法是:
webUrl:检查该字段是否包含有效的url(始终通过API Level <8中的测试)
您可以在这里查看:https://github.com/vekexasia/android-form-edittext
希望你喜欢它 :)
在我链接的页面中,您还可以找到电子邮件验证的示例。我将在此处复制相对代码段:
1 2 3 4 5 6 7 8 9 | <com.andreabaccega.widget.FormEditText style="@android:style/Widget.EditText" whatever:test="email" android:id="@+id/et_email" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/hint_email" android:inputType="textEmailAddress" /> |
还有一个测试应用程序展示了库的可能性。
这是验证电子邮件字段的应用程序的屏幕截图。
1 2 3 4 5 6 7 8 9 10 | 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(); } |
如果您使用的是API 8或更高版本,则可以使用现成的
1 2 3 4 5 6 7 | public final static boolean isValidEmail(CharSequence target) { if (target == null) { return false; } else { return android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches(); } } |
如果您偶然支持的API级别小于8,那么只需将
这里有几个不错的选择,包括API 8+的android.util.Patterns.EMAIL_ADDRESS。
https://stackoverflow.com/a/7882950/1011746
试试这个模式。
editText.addTextChangedListener(new TextWatcher(){
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | @Override public void afterTextChanged(Editable s) { pattern = Pattern.compile(".+@.+\\\\.[a-z]+"); matcher = pattern.matcher(editText.getText().toString()); if(matcher.matches()) { Log.i("Test","--------Valid Email--------"); }else { Log.i("Test","--------Invalid Email------"); } } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } }); |
不要在代码中这样做。您可以使用EditText的inputType属性。
1 2 3 4 5 | <EditText android:id="@+id/edit_text" android:layout_width="fill_parent" android:layout_height="wrap_content" android:inputType="textEmailAddress"/> |
//验证您的电子邮件地址格式。前[email protected]
1 2 3 4 5 6 7 8 9 | 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | private boolean validateEmailAddress(CharSequence emailAddress) { if( Build.VERSION.SDK_INT >= 8 ) { return android.util.Patterns.EMAIL_ADDRESS.matcher(emailAddress).matches(); } 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(emailAddress); return matcher.matches(); } |