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 つのグループを定義したため、このメソッドは 1 を返します。

find()もう一度呼び出すことで、パターンに次の一致を見つけることができます。パターンに一致する入力シーケンスの次のサブシーケンスを見つけようとします。が返さfalseれると、これ以上一致するものがないことがわかります。

したがって、次のように一致を繰り返す必要があります。

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

はい、あなたのコードでは、1 つの一致を行うだけで、その 1 つの一致でグループがキャプチャされます。

他の一致を取得したい場合は、find()false が返されるまでループで一致を続行する必要があります。

したがって、基本的に必要なのは、と置き換えるだけifwhile、そこにいます。

于 2012-08-02T11:30:59.330 に答える