1

我找到了一个正则表达式,它匹配用 {} 包围的标记,但它似乎只找到第一个找到的项目。

如何更改以下代码以便找到所有令牌而不仅仅是 {World},我需要使用循环吗?

// The search string
String str = "Hello {World} this {is} a {Tokens} test";

// The Regular expression (Finds {word} tokens)
Pattern pt = Pattern.compile("\\{([^}]*)\\}");

// Match the string with the pattern
Matcher m = pt.matcher(str);

// If results are found
if (m.find()) {
    System.out.println(m);
    System.out.println(m.groupCount()); // 1
    System.out.println(m.group(0)); // {World}
    System.out.println(m.group(1)); // World (Get without {})
}
4

2 回答 2

4

groupCount()方法不返回匹配的数量,它返回此匹配器模式中捕获组的数量。您在模式中定义了一个组,因此此方法返回 1。

您可以通过再次调用找到与您的模式匹配的下一个匹配项find();它将尝试找到与模式匹配的输入序列的下一个子序列。当它返回时false,您会知道没有更多匹配项。

因此,您应该像这样遍历您的匹配项:

while (m.find()) {
    System.out.println(m.group(0));
}
于 2012-08-02T11:35:36.377 回答
1

是的,在您的代码中,您只需进行一次匹配,并在该单一匹配中获取组。

如果要获取其他匹配项,则必须在循环中继续匹配,直到find()返回 false。

所以基本上你需要的只是替换ifwhile你就在那里。

于 2012-08-02T11:30:59.330 回答