Java Can';t遍历匹配器

Java Can';t遍历匹配器,java,regex,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}”的唯一结果匹配。不管

我正在尝试这样做:

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}”的唯一结果匹配。不管我如何改变它,例如,这里我得到{do something}匹配


我想遍历所有匹配项。我怎么做

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

考虑到这一点,让我们用其等价物替换character类:

^.*(\{([^{}]+)\}).*$
在第一个
*
之后,正则表达式将已经匹配了所有输入字符串。但是,匹配不完整:需要匹配
{

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

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

因此,第一件事是修复您的字符类:我不知道您在编写
[\d\d]
时的意思,但它肯定不是“匹配任何字符”

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

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

匹配器中使用此正则表达式
,您将拥有您的匹配项(与
m.group(1)
)。

您的正则表达式在输入的开头和结尾都被锚定,因此它只匹配一次……另外,您想与
[\d\d]匹配是什么意思
?这匹配任何字符,因为
\D
\D
的补充。将正则表达式更改为
{([^{}]+}
您正确地使用了
find()
方法。顺便说一句,它实际上只有一个匹配项。谢谢,我会尝试更改它。我不知道锚定了什么。
[\D\D]
几乎等同于
[\d\d]
将包含换行符,而在这种情况下,
不会包含换行符。请参阅类的文档。目的是匹配任何字符,但为什么它会在{do something}上停止没有继续进行下一个匹配?再看看我的答案;您的字符类在被迫返回字符之前吞掉了所有输入。这就是为什么您只获得了最后一个匹配。您所说的swalloaed是什么意思?我不记得我读过它,我习惯Perl正则表达式(还没有在Perl中尝试过)。如果我将最后一个*更改为+,它将给出第一个匹配项,那么为什么它会吞下其他匹配项?尝试并展开正则表达式,您将看到为什么
++
给出第一个匹配项。Java和perl的正则表达式引擎的操作方式类似。