首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用两个字节的字符从日语输入电子邮件地址验证?

如何用两个字节的字符从日语输入电子邮件地址验证?
EN

Stack Overflow用户
提问于 2017-11-22 17:54:19
回答 3查看 448关注 0票数 1

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

firstname―lastname@domain.com应该是有效的,但被认为是无效的。All case https://blogs.msdn.microsoft.com/testing123/2009/02/06/email-address-test-cases/ Only case firstname―lastname@domain.com with return false全部正确

这是我的代码,我正在使用unicode Halfwidth和Fullwidth表单http://jrgraphix.net/r/Unicode/FF00-FFEF

大小写-减号-> FF0D返回false时出错。预期结果:返回true

代码语言:javascript
复制
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}" +
                ")+"
);

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

EN

回答 3

Stack Overflow用户

发布于 2017-11-24 04:54:41

名字-姓氏@域名应有效

事实并非如此。此地址中没有@ (U+0040商业地址)符号,只有 (U+FF20全宽度商业地址)不是有效的本地部分/域分隔符。

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

一般来说,在接受日语用户的输入时,最好将所有“兼容性”的全角和半角字符转换为普通的ASCII字符。使用Unicode Normalizer,您就有了一个可以尝试验证的字符串:

代码语言:javascript
复制
input = Normalizer.normalize(input, Normalizer.Form.NFKC);
"firstname―lastname@domain.com"

注意:本例中的破折号字符既不是ASCII连字符,也不是全宽形式。这是一个U+2015单杠。不知道这是从哪里来的。虽然在国际化电子邮件地址中包含本地部分在技术上是有效的,但许多电子邮件地址验证器会拒绝它,因为它非常奇怪,而且可能不是本意。

不要花太多时间来验证电子邮件地址。你可能会发疯,试图以正则表达式的形式复制RFC的确切规则(即使那些没有人使用的规则,实际上也不会起作用),或者你可能会发疯,试图强制执行自己关于什么是可能正确的地址的想法。最好避免疯狂,让它保持简单。例如,它是否包含一个@,然后是一个.?然后让我们试着发送给它,看看会发生什么

票数 3
EN

Stack Overflow用户

发布于 2017-11-22 18:51:49

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

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

代码语言:javascript
复制
^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$

它已经在abc_d@gmail.com上进行了测试。

票数 0
EN

Stack Overflow用户

发布于 2017-11-22 19:37:46

代码语言:javascript
复制
public final static boolean isValidEmail(CharSequence target) {
  return !TextUtils.isEmpty(target) && android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches();
}

例如。String str = edittextemail.gettext().tostring();

代码语言:javascript
复制
if(isValidEmail(str)){ // valid email is return true.
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47431503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档