我是正则表达式的新手,但我想学习。以下是电子邮件验证的示例:
public class x
{
public static void main(String[] args)
{
String pattern = "[a-zA-Z0-9]+[a-zA-Z0-9._]*[a-zA-Z0-9]*+@[a-zA-Z0-9]*[.]([a-z][a-z]|[a-z][a-z][a-z])";
String text = "g@gmail.co";
System.out.println(text.matches(pattern));
}
}
我试着写电子邮件验证。哪里我错了,我可以优化什么?感谢。
答案 0 :(得分:1)
这个正则表达式相当完整,速度,复杂性和有效性之间的合理平衡:
[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|org|net|edu|gov|mil|biz|info|mobi|name|aero|asia|jobs|museum)\b
恕我直言,最好的正则表达式学习网站是regular-expresssions.info,它也有a discussion on email validation(我得到了这个正则表达式)
答案 1 :(得分:1)
使用正则表达式准确验证电子邮件地址是不切实际的。电子邮件地址的格式非常复杂,正如在Wikipedia上非正式地描述的那样,更正式地在从该页面链接的RFC中。
正如你从其他人给出的答案中看到的那样,任何试图解决复杂事物的正则表达对人类来说都是不可理解的;所以你永远不能确定它是否正确。
这不仅仅是一个理论问题。任何复杂的电子邮件验证代码都会遇到无法快速处理的案例。作为一个密切相关的领域的例子,我经常不得不在与计算机交谈时撒谎,因为它有一个连字符。
您应该考虑通过验证尝试实现的目标。您想排除哪些价值,这样做的成本是多少?你真的想要排除用户方面的错误,很可能是拼写错误;但绝大多数(可能的)拼写错误都会产生有效的电子邮件地址,所以你不会抓住这些。
验证电子邮件地址的唯一实用方法是向其发送电子邮件。如果您确实需要为用户提供电子邮件地址,那么这是确保您拥有有效电子邮件地址的唯一方式。
答案 2 :(得分:0)
你可以试试这个:
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();
}
}
模式必须是:
^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$
如果你想要更多解释,请告诉我。