关于java:如何使用字符两个字节的电子邮件地址验证来输入日语?

How to email address validation with character two bytes for input from Japanese?

我正在尝试编写一个程序,让用户输入一个电子邮件地址。然后我验证它是否是一个有效的电子邮件地址,输入两个大小写的普通字符和两个字节的特殊字符

像EDOCX1[0]一样应该是有效的,但被认为是无效的。一切都是对的https://blogs.msdn.microsoft.com/testing123/2009/02/06/email-address-test-cases/只有firstname―lastname@domain.com返回假

这是我的代码,我使用的是Unicode半宽和全宽格式http://jgraphix.net/r/unicode/ff00-ffef

大小写连字符减号出错->ff0d返回false。预期结果:返回true

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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}" +
               ")+"
);

如果有人能帮忙,我们将不胜感激!


firstname―lastname@domain.com should be valid

不是这样。此地址中没有@(U+0040商业AT)符号,只有一个(U+ff20商业AT),它不是有效的本地部分/域分隔符。

(本地部分和域中的全角字符也可能存在传递问题;这在技术上可能不会使地址本身无效,但几乎肯定是输入错误。)

一般来说,接受日本用户的输入时,最好将所有"兼容性"全角和半宽字符转换为普通的ASCII字符。使用Unicode规范化程序,然后您可以尝试验证一个字符串:

1
2
input = Normalizer.normalize(input, Normalizer.Form.NFKC);
"firstname―[email protected]"

注意,本例中的破折号既不是ASCII连字符,也不是全形。它是一个U+2015水平杆。不知道从哪里来的。虽然从技术上讲,在本地使用国际化的电子邮件地址是有效的,但是许多电子邮件地址验证器会拒绝它,因为它非常奇怪,可能不是它的意思。

不要花太多时间来验证电子邮件地址。你可以疯狂地尝试以regex的形式复制RFC的确切规则(甚至那些没有人使用的规则,在现实中不会起作用的规则),或者你可以疯狂地尝试强制你自己的想法,什么可能是一个正确的地址。最好避免这种疯狂,保持简单。它包含一个@和一个.?那么让我们试着发送给它看看会发生什么


1
2
3
public final static boolean isValidEmail(CharSequence target) {
  return !TextUtils.isEmpty(target) && android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches();
}

例如,string str=edittextemail.getText().toString();

1
2
if(isValidEmail(str)){ // valid email is return true.
  }


是否检查了正则表达式的有效性?我认为问题出在正则表达式中。

使用这个正则表达式,希望能有所帮助。

1
^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$

它已经在[email protected]上测试过了。