0
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)”。

4

3 回答 3

0

错误是您\\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)'
于 2012-09-24T15:41:40.460 回答
0

在您的正则表达式中间,有以下部分:

\\s+)\\s+

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

于 2012-09-24T15:41:47.990 回答
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");
于 2012-09-24T15:48:56.587 回答