给出以下字符串
1_! 37 ! 2012071200003588 ! EAKRE !
如何使用模式通过使用37
在不同的组中获取2012071200003588
,EAKRE
和m.group(i)
,但使用相同的(重复的)组括号?< / p>
我尝试使用这种模式:.+_!{1}(\s+(\d+|\w+)\s+!){1,}.?
,但它只给出了以下结果:
Groups: 2
Group 0: 13_! b ! 2012071200005353 ! IAUEB !
Group 1: IAUEB !
我想要得到的是:
Groups: 2
(not needed) Group 0: 13_! b ! 2012071200005353 ! IAUEB !
Group 1: IAUEB
Group 2: 2012071200003588
Group 3: EAKRE
正则表达式必须是自我重复/必须返回多个组,因为我的字符串可能有三个以上的值,并且必须返回所有值。
我的测试方法如下所示
private void testPattern() {
String test = "13_! b ! 2012071200005353 ! IAUEB !";
Pattern p = Pattern
.compile(".+_!{1}(\\s+(\\d+|\\w+)\\s+!){1,}.?");
Matcher m = p.matcher(test);
if (m.matches()) {
System.out.println("Gruppen: "+ m.groupCount());
for (int i = 0; i < m.groupCount(); i++) {
System.out.println("Gruppe "+i+": "+m.group(i));
}
}
}
答案 0 :(得分:0)
您希望通过使用“?:”启动组内部来使外部组成为非捕获组。它应该是这样的:
.+_!{1}(?:\s+(\d+|\w+)\s+!){1,}.?
我认为这正是您所寻找的,尽管您的示例输出似乎与输入不一致。您也可以在开始时删除{1}
,因为它是多余的:
.+_!(?:\s+(\d+|\w+)\s+!){1,}.?
答案 1 :(得分:0)
将我的评论翻译成OP的答案:
String str = " 1_! 37 ! 2012071200003588 ! EAKRE !";
String[] toks = str.split(" *! *");
System.out.println(toks[1]); // 37
System.out.println(toks[2]); // 2012071200003588
System.out.println(toks[3]); // EAKRE