正在验证Java中包含非英语(UTF-8)字符的电子邮件地址
我有一个空闲的电子邮件id正在验证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
闪闪发光@闪闪发光.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长度的假设最终都可能失败。