Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正在验证Java中包含非英语(UTF-8)字符的电子邮件地址_Java_Regex_Email Validation - Fatal编程技术网

正在验证Java中包含非英语(UTF-8)字符的电子邮件地址

正在验证Java中包含非英语(UTF-8)字符的电子邮件地址,java,regex,email-validation,Java,Regex,Email Validation,我有一个空闲的电子邮件id 闪闪发光@闪闪发光.com 我需要在服务器端验证此类型的电子邮件,以便用户无法输入此类型的电子邮件。 我用下面的正则表达式解决了javascript中类似的问题- /^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/gi 但是。无法在java中执行相同的操作。请帮帮我。 提前感谢 [Update]很抱歉js代码。试试这个: import java.util.regex.Matcher

我有一个空闲的电子邮件id

闪闪发光@闪闪发光.com 
我需要在服务器端验证此类型的电子邮件,以便用户无法输入此类型的电子邮件。
我用下面的正则表达式解决了javascript中类似的问题-

/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/gi
但是。无法在java中执行相同的操作。请帮帮我。

提前感谢

[Update]很抱歉js代码。试试这个:

import java.util.regex.Matcher;
import java.util.regex.Pattern;


    public class EmailValidator{

          private Pattern pattern;
          private Matcher matcher;

          private static final String EMAIL_PATTERN = 
                       "^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@
                       [A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";

          public EmailValidator(){
              pattern = Pattern.compile(EMAIL_PATTERN);
          }

          /**
           * Validate hex with regular expression
           * @param hex hex for validation
           * @return true valid hex, false invalid hex
           */
          public boolean validate(final String hex){

              matcher = pattern.matcher(hex);
              return matcher.matches();

          }
    }

Java正则表达式模式
(?i)[-a-z0-9+\][a-z0-9+\.]*@[-a-z0-9][a-z0-9.]*\.[a-z]{2,6}
应该足够了。以下是模式的含义:

(?i)            # Case insensitive flag
[-a-z0-9+_]     # First character
[-a-z0-9+_.]*   # Zero or more characters
@               # Literal '@' character
[-a-z0-9]       # Match a single character
[-a-z0-9.]*     # Match zero or more characters
\.              # Literal '.' character
[a-z]{2,6}      # Match 2 through 6 alpha characters
下面的测试代码

final String ps =
        "(?i)[-a-z0-9+_][-a-z0-9+_.]*@[-a-z0-9][-a-z0-9.]*\\.[a-z]{2,6}";
final Pattern p = Pattern.compile(ps);
for (String s : new String[] {"foo@bar.COM", "+foo@bar.COM",
        "-foo@bar.COM", "fo_o@bar.COM", "f.oo@bar.COM", "a@b.cdefgh",
        "3@4.com", "3@4.5.6-7.8.com", ".foo@bar.com", "a@b.cdefghi",
        "闪闪发光@闪闪发光.com"})
{
    final Matcher m = p.matcher(s);
    if (m.matches()) {
        System.out.println("Success: " + s);
    } else {
        System.out.println("Fail: " + s);
    }
}
。。。将输出:

Success: foo@bar.COM
Success: +foo@bar.COM
Success: -foo@bar.COM
Success: fo_o@bar.COM
Success: f.oo@bar.COM
Success: a@b.cdefgh
Success: 3@4.com
Success: 3@4.5.6-7.8.com
Fail: .foo@bar.com
Fail: a@b.cdefghi
Fail: 闪闪发光@闪闪发光.com

通过使用
Matcher.matches()
方法,您不需要包含
^
行开始或
$
行结束边界匹配构造,因为
Matcher.matches()
将匹配整个字符串。

问题出在哪里?Java正则表达式模式和Matcher应该可以…您确定要排除UTF域名吗?是的,我知道,但我不知道如何实现此功能..=这太愚蠢了。电子邮件地址中允许使用UTF-8。在我看来不像Java代码!?你为什么希望这个“失败”:a@b.cdefghi“失败?这难道不是一个完全有效的内部电子邮件地址吗root@lcal1ap.prelife(我现在正在使用的机器;D)@angelo'Sphere:OP将顶级域名限制为2到6个字符;应超过6个字符失败。我想这是因为这里最长的TLD是
博物馆
。。。6个字符。@Dan Cruz感谢您的解释性回答。如果我不想将顶级域限制为6个,那么我需要这样做-
(?i)[-a-z0-9+\][a-z0-9+.]*@[-a-z0-9][-a-z0-9.]*\.[a-z]*
或其他东西。@Vivek:我会在模式的末尾使用
\.[a-z]+
+
将确保在
之后至少有一个字符;而
*
可能会给您留下一个类似
a@b.
。现在,TLD的长度可以超过6个字符,并且每年都会创建更多字符,因此任何TLD长度的假设最终都可能失败。