如何在java reg exes中获得多个自重组?

时间:2015-03-12 17:13:08

标签: java regex

给出以下字符串

                                        1_!   37            !   2012071200003588   ! EAKRE     !

如何使用模式通过使用37在不同的组中获取2012071200003588EAKREm.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));
      }
   }
}

2 个答案:

答案 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