Java正则表达式字符串输出不符合预期

时间:2014-03-03 09:46:08

标签: java regex validation email

我正在尝试编写一些代码来根据给我的具体指导来验证电子邮件地址,其中一条指南是cath @ [10.1.1]这样的地址应该有效。我已经陷入困境,无法弄清楚我的正则表达式字符串有什么问题:

 "[A-Za-z0-9._%+-]+[@|_at_]+[\\[|[A-Za-z0-9-]]+[0-9\\.|_dot_]+[\\]|com|com.au|co.ca|co.nz|co.us|co.uk]{2,4}"

这是一些示例输出:

Enter an email address
cath@[10.1.1]
cath@[10.1.1] is not a valid email address
cath@[10.1.1.a]
cath@[10.1.1.a] is a valid email address
cath@[10.1.1.]
cath@[10.1.1.] is a valid email address

最后两个输入/输出应无效,而第一个应有效。任何人都可能指出我正确的方向吗?感谢

编辑 - 这是我的代码,如果它可以帮助任何人

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

public class EmailAddresses {

  public static void main(String[] args) {

    String line;        
    System.out.println("Enter an email address");
    Scanner scan = new Scanner(System.in);
    while (scan.hasNextLine()) {

      line = scan.nextLine();
      Pattern pattern = Pattern.compile("[A-Za-z0-9._%+-]+(?:@|_at_)(?:\\[|[A-Za-z0-9-])(?:0-9\\.|_dot_)(?:\\]|com|com\\.au|co\\.ca|co\\.nz|co\\.us|co\\.uk){2,4}");
      Matcher mat = pattern.matcher(line);

      if(mat.matches()){
        line = line.toLowerCase();
        System.out.println(line + " is a valid email address");
      }else{
        System.out.println(line + " is not a valid email address");
      }
    }
  }
}

2 个答案:

答案 0 :(得分:0)

以下是正则表达式与初始正则表达式理解的内容:

Regular expression visualization

我认为存在误解。括号[]创建一个字符类:一系列字符替代品。

这里的括号用于声明一系列单词替代,这不是意图行为。要声明单词替换序列,请使用非捕获组(?:...),并在此组中使用逻辑运算符|

例如:

"[\\[|[A-Za-z0-9-]]+"变为"(?:\\[|[A-Za-z0-9-])+"

请尝试使用此正则表达式:

^[A-Za-z0-9._%+-]+(?:@|_at_)(?:\[(?:\d|\.|_dot_)+(?<!\.)\]|[A-Za-z\d._-]+\.(?:com|com\.au|co\.ca|co\.nz|co\.us|co\.uk))$

描述

Regular expression visualization

演示

http://regex101.com/r/dS8qF4

答案 1 :(得分:0)

由于您不限于使用单个正则表达式,我建议您拆分支票。

例如,这是一个尝试在输入中找到分隔符的方法:

private static int trySeparator(final String input, final String separator)
{
    int ret = input.indexOf(separator);
    if (ret == -1)
        return ret;
    return ret == input.lastIndexOf(separator) ? ret : -1;
}

@_at_的主要验证方法中使用它,然后将第一个和第二个部分分开并单独检查。比单个正则表达式更容易,更容易测试;)