无法通过匹配器进行迭代

时间:2014-02-26 19:09:28

标签: java regex

我正在尝试这样做:

String regex= "^[\\d\\D]*([{]([^{}]+)[}])[\\d\\D]*$";
Matcher groupMatcher = Pattern.compile(regex).matcher(command);
int counter = 0;
while(groupMatcher.find()){
  counter++;
}
//print counter

我总是得到反击1并且只得到“{name} {做某事}”的匹配。无论我如何改变它,例如我得到{do something}匹配。

我想迭代所有的比赛。我该怎么做?

1 个答案:

答案 0 :(得分:2)

首先,您应该修复[\d\D]\D\d的补码,这意味着它将匹配\d不匹配的任何字符。基本上,这个字符类相当于. ...

鉴于此,让我们用等效的字符替换字符类:

^.*(\{([^{}]+)\}).*$

在第一个.*之后,正则表达式已经匹配了所有输入字符串。但是,匹配不完整:需要匹配{

因此,.*逐个字符地向正则表达式引擎返回,除非它到达{ - 这将是{之前的{do something}

因此,您的第一个捕获组将包含{do something}

首先要修复你的角色类:我不知道你写[\d\D]时的意思,但肯定不是“匹配任何角色”!

这是一个正则表达式,它将尝试匹配大括号内的所有参数:

\{([^{}]+)\}

Matcher中使用此正则表达式,您将获得匹配(m.group(1))。