如何在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 ! 伊奥布代码>