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的正则表达式引擎的操作方式类似。