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)”。
错误是您\\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)'
在您的正则表达式中间,有以下部分:
\\s+)\\s+
它正在寻找两个必需的连续空格。这不存在,因此正则表达式失败。
试试这个:^(\\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");