我该如何解决这个正则表达式?

时间:2012-09-24 15:34:48

标签: java regex

String input = "2012 AL REG TEXT 300535(NS)";
String regex = "^((\\d{4})\\s+)?((\\S+)\\s+(.+?)\\s+)\\s+((\\S+)(\\s+\\(.*?\\)))$";

我想在一个组中捕获2012,在另一组中捕获“AL REG TEXT”,在另一组中捕获“300535(NS)”。

3 个答案:

答案 0 :(得分:0)

错误是你在预期的parantheses之前有一个额外的\\s+,并且正如@cmonkey指出的那样,在中间有一个额外的\\s+。删除这些,它的工作原理。另外,要仅获取上面提到的群组,请将?:添加到您不想捕获的群组中:

String input = "2012 AL REG TEXT 300535(NS)";
String regex = "^(?:(\\d{4})\\s+)?((?:\\S+)\\s+(?:.+?))\\s+((?:\\S+)(?:\\(.*?\\)))$";
Matcher m = Pattern.compile(regex).matcher(input);
if (m.matches()) {
    for (int i = 1; i <= m.groupCount(); i++) {
        System.out.format("Group %d: '%s'%n", i, m.group(i));
    }
}

打印

Group 1: '2012'
Group 2: 'AL REG TEXT'
Group 3: '300535(NS)'

答案 1 :(得分:0)

在正则表达式的中间,有一部分:

\\s+)\\s+

正在寻找两个必需的连续空格。这不存在,因此正则表达式失败。

答案 2 :(得分:0)

试试这个:^(\\d{4})?\\s+(\\D+)\\s+(\\d.*)$

以下是代码:

    String input = "2012 AL REG TEXT 300535(NS)";
    String regex = "^(\\d{4})?\\s+(\\D+)\\s+(\\d.*)$";

    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(input);
    if(m.matches()) {
        System.out.println("Group count: "+m.groupCount());
        for(int i=0; i<=m.groupCount(); i++) {
            System.out.println("Group "+i+": "+m.group(i));
        }
    }
    else System.out.println("No match");