如何在java注册表中获取多个自重复组?

如何在java注册表中获取多个自重复组?,java,regex,Java,Regex,给定以下字符串 1_! 37 ! 2012071200003588 ! EAKRE ! 通过使用m.group(I),但使用相同的(重复的)大括号,我如何使用模式在不同的组中获取37、201207120003588和EAKRE 我尝试了以下模式:+\!{1} (\s+(\d+|\w+\s+!){1,}.?,但它只给出以下结果: Groups: 2 Group 0: 13_!

给定以下字符串

                                        1_!   37            !   2012071200003588   ! EAKRE     !
通过使用
m.group(I)
,但使用相同的(重复的)大括号,我如何使用模式在不同的组中获取
37
201207120003588
EAKRE

我尝试了以下模式:
+\!{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));
      }
   }
}
private void testPattern(){
字符串测试=“13_u33;b!201207120005353!IAUEB!”;
模式p=模式
.compile(“.++.{1}(\\s+(\\d++.\\w+\\s+){1,}.?”);
匹配器m=p.匹配器(测试);
如果(m.matches()){
System.out.println(“Gruppen:+m.groupCount());
对于(int i=0;i
您希望通过以“?:”开始组内部,使外部组成为非捕获组。应该是这样的:

.+_!{1}(?:\s+(\d+|\w+)\s+!){1,}.?
我认为这就是您想要的,尽管您的示例输出似乎与输入不一致。您还可以在开始时删除
{1}
,因为它是冗余的:

.+_!(?:\s+(\d+|\w+)\s+!){1,}.?

将我的评论翻译成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

为什么不按
“*!*”
分割?正则表达式可能不是您想要做的事情的最佳工具。请注意,.NET正则表达式确实有一个选项,可以检索捕获组的所有重复值,但不能检索Java。@anubhava我只是想知道如何使用reg exp实现它,因为我认为这应该是可能的。拆分也是可能的,但这里不需要。是什么让你认为使用
“*!*”
拆分
不是正则表达式?@anubhava也许我只是在错误的维度上思考。您能更详细地解释一下如何使用拆分吗?我不在电脑上,如果有任何代码片段,我将不胜感激。谢谢。对不起,但这个提议的模式(至少)对我不起作用。我的Java控制台的输出看起来是这样的:
Gruppen:1
gruppe0:13!B2012071200005353   ! 伊奥布