Java 如何使用两个字节的字符验证电子邮件地址,以便从日语输入?
我正在尝试编写一个程序,要求用户输入电子邮件地址。然后我用两个大小写输入正常和两个字节输入特殊字符来验证它是否是一个有效的电子邮件地址 像Java 如何使用两个字节的字符验证电子邮件地址,以便从日语输入?,java,android,regex,email,unicode,Java,Android,Regex,Email,Unicode,我正在尝试编写一个程序,要求用户输入电子邮件地址。然后我用两个大小写输入正常和两个字节输入特殊字符来验证它是否是一个有效的电子邮件地址 像firstname―lastname@domain.com应有效,但被视为无效。 所有案例都是正确的 仅限大小写firstname―lastname@domain.com带有―返回false 这是我的代码,我使用unicode半宽度和全宽度表单 大小写连字符减号->FF0D返回false时出错。 预期结果:返回true private VALIDATE_CO
firstname―lastname@domain.com代码>应有效,但被视为无效。
所有案例都是正确的
仅限大小写<代码>firstname―lastname@domain.com代码>带有―
返回false
这是我的代码,我使用unicode半宽度和全宽度表单
大小写连字符减号->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}" +
")+"
);
如果有人能帮忙,我们将不胜感激 您是否检查了正则表达式是否有效?我认为问题在于正则表达式
使用这个正则表达式我希望它有帮助
^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$
它已经在abc上测试过了_d@gmail.com.
public final static boolean isValidEmail(CharSequence target) {
return !TextUtils.isEmpty(target) && android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches();
}
例如String str=edittextemail.gettext().tostring()
firstname―lastname@domain.com 应该是有效的
不是。此地址中没有@
(U+0040商用At)符号,只有一个
(U+FF20全宽商用At)不是有效的本地部分/域分隔符
(本地部分和域中的全宽字符也可能存在交付问题;从技术上讲,这可能不会使地址本身无效,但几乎肯定是输入错误。)
一般来说,当接受来自日本用户的输入时,最好将所有“兼容”全宽和半宽字符转换为普通ASCII字符。使用Unicode,则可以尝试验证以下字符串:
input = Normalizer.normalize(input, Normalizer.Form.NFKC);
"firstname―lastname@domain.com"
请注意,本例中的破折号字符既不是ASCII连字符,也不是全宽格式。这是一个U+2015单杠。不知道从哪里来的。虽然在国际化电子邮件地址中包含本地部分在技术上是有效的,但许多电子邮件地址验证器会拒绝它,因为它非常奇怪,可能不是它的意思
不要花太多时间尝试验证电子邮件地址。你可以疯狂地尝试以正则表达式形式复制RFC的确切规则(即使是无人使用且实际上不起作用的规则),也可以疯狂地尝试强制执行你自己关于什么可能是正确地址的想法。最好避免疯狂,保持简单。例如,它是否包含一个@
和一个
?然后我们试着发送到它,看看会发生什么我会使用标准的电子邮件正则表达式。您可能还需要设置正确的字符编码。请解释此代码的作用以及它如何解决OP的问题。
input = Normalizer.normalize(input, Normalizer.Form.NFKC);
"firstname―lastname@domain.com"