我正在尝试编写一个程序,要求用户输入电子邮件地址。然后我验证它是否是一个有效的电子邮件地址,有两个案例输入正常和输入特殊字符两个字节
类似firstname―lastname@domain.com
应该有效,但被视为无效。
所有情况都是对的
https://blogs.msdn.microsoft.com/testing123/2009/02/06/email-address-test-cases/
只有firstname―lastname@domain.com
―
的情况才会返回false
这是我的代码,我正在使用unicode Halfwidth和Fullwidth Forms http://jrgraphix.net/r/Unicode/FF00-FFEF
案例连字符错误 - > FF0D返回false。 预期结果:返回true
private VALIDATE_CODE validateInput(String username, String password) {
if (username.length() == 0 || password.length() == 0) {
return VALIDATE_CODE.EMPTY_USERNAME_PASSWORD;
}
if (!StringUtil.isValidEmail(username)) {
return VALIDATE_CODE.INVALID_USERNAME_PASSWORD;
}
return VALIDATE_CODE.SUCCESS;
}
public static boolean isValidEmail(CharSequence email) {
boolean validFullSize = ValidateUtil.EMAIL_ADDRESS_JAPANESE.matcher(email).matches();
boolean validHaftSize = android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches();
return !TextUtils.isEmpty(email) && (validFullSize || validHaftSize);
}
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}" +
")+"
);
public static final Pattern EMAIL_ADDRESS_JAPANESE
= Pattern.compile(
"[\uFF41-\uFF5A\uFF21-\uFF3A\uFF10-\uFF19\\\uFF0B\\\uFF0E\\\uFF3F\\\uFF05\\\uFF0D\\\uFF0B]{1,256}" +
"\\\uFF20" +
"[\uFF41-\uFF5A\uFF21-\uFF3A\uFF10-\uFF19][\uFF41-\uFF5A\uFF21-\uFF3A\uFF10-\uFF19\\\uFF0D]{0,64}" +
"(" +
"\\\uFF0E" +
"[\uFF41-\uFF5A\uFF21-\uFF3A\uFF10-\uFF19][\uFF41-\uFF5A\uFF21-\uFF3A\uFF10-\uFF19\\\uFF0D]{0,25}" +
")+"
);
如果有人可以提供帮助,我们将不胜感激!
答案 0 :(得分:2)
firstname-lastname@domain.com应该有效
不是。此地址中没有@
(U + 0040 Commercial At)符号,只有@
(U + FF20 Fullwidth Commercial At),它不是有效的本地/部分/域分隔符。
(本地部分和域中的全宽字符也可能存在传送问题;从技术上讲,这可能无法使地址无效,但几乎肯定是错误的输入。)
通常,当接受日本用户的输入时,最好将所有“兼容性”全宽和半宽字符转换为普通的ASCII字符。使用Unicode Normalizer,然后您有一个可以尝试验证的字符串:
input = Normalizer.normalize(input, Normalizer.Form.NFKC);
"firstname―lastname@domain.com"
请注意,此示例中的短划线字符既不是ASCII连字符也不是Fullwidth形式。这是一个U + 2015单杠。不知道那会是从哪里来的。虽然在国际化的电子邮件地址中使用本地部分在技术上是有效的,但许多电子邮件地址验证器会拒绝它,因为它很奇怪,可能不是那个意思。
不要花太多时间来验证电子邮件地址。你可能会疯狂地试图以正则表格形式复制RFC的确切规则(即使是没有人使用的那些规则)并且实际上不会起作用),或者你可以疯狂地试图强制执行你自己关于什么是可能正确的地址的想法。更好地避免疯狂并保持简单。例如,它包含@
,然后是.
吗?然后让我们尝试发送它,看看会发生什么
答案 1 :(得分:0)
您是否检查了正则表达式是否有效?我认为这个问题出现在正则表达式中。
使用此正则表达式我希望它有所帮助。
^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$
已经在abc_d@gmail.com上进行了测试。
答案 2 :(得分:0)
public final static boolean isValidEmail(CharSequence target) {
return !TextUtils.isEmpty(target) && android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches();
}
实施例。 String str = edittextemail.gettext()。tostring();
if(isValidEmail(str)){ // valid email is return true.
}