2016-08-01 61 views
0

我使用的电子邮件验证模式是How to validate an email,它的工作正常,但它允许在电子邮件的第一部分中使用+,并且这在我的规格中是不允许的。原始代码是电子邮件验证模式未封闭的字符类

public 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,})$"; 

protected boolean isInvalidEmail(String email) { 
    pattern = Pattern.compile(EMAIL_PATTERN); 
    matcher = pattern.matcher(email); 
    return !matcher.matches(); 
} 

我想我可能只是删除"^[_A-Za-z0-9-\\+]+但我得到一个Pattern Syntax Exception: Unclosed Character Class。有人可以告诉我为什么取消+解锁班?谢谢!

回答

2

您必须删除\\+部分。

\\逃脱\字符。 \+转义+正则表达式运算符。因此\\+分解为\+这意味着匹配文字+字符。

注意:+正则表达式运算符意味着匹配一个或多个前面的元素。

+0

这很奇怪,他们把'\\ +'放在最后的'-'后面,不是吗? '-'只在字符类的开始或结尾处有其字面表示,否则作为范围运算符。所以这个正则表达式的来源似乎是不可信的。 –

+0

@AndrewCheong我认为这很奇怪,但[前5名正则表达式测试人员](https://www.google.com/search?client=ubuntu&channel=fs&q=java+regex+tester&ie=utf-8&oe=utf- 8)不显示任何错误,并且它匹配有效的字符串,例如'example- @ email.com'。虽然,如果连字符不在开头或结尾,那么它应该被转义('\ -')。 –

2

它为您提供Unclosed Character Class的原因是因为现在只有删除+才会转义方括号,因此它被认为是模式的一部分。因此,班级没有匹配的方括号。正如Jonny Henly提到的解决方案是删除\\+以符合您的规范,但这给出了答案,为什么它没有关闭。

+0

*这给出了答案,为什么它没有关闭* - +1 –