2016-04-29 9 views
4

ブラケット(括弧を含む)内の1つの単語に一致させたい場合は、下にあるRegexが動作していますが、ここでJavaでキャプチャされたすべてのグループを取得する

は私のコードです:

String text = "This_is_a_[sample]_text[notworking]"; 
Matcher matcher = Pattern.compile("\\[([a-zA-Z_]+)\\]").matcher(text);          
if (matcher.find()) { 
    for (int i = 0; i <= matcher.groupCount(); i++) { 
    System.out.println("------------------------------------"); 
    System.out.println("Group " + i + ": " + matcher.group(i)); 
} 

また、私はRegex Planetでそれをテストしてみたし、動作しているようです。

------------------------------------ 
Group 0: [sample] 
------------------------------------ 
Group 1: sample 
------------------------------------ 
Group 2: [notworking] 
------------------------------------ 
Group 3: notworking 

をしかし、それはちょうどそれを返しています:

それは4つのグループを返す必要があります

------------------------------------ 
Group 0: [sample] 
------------------------------------ 
Group 1: sample 

何が悪いのでしょうか?

答えて

6

JAVAは、一度にすべての一致を見つけるために派手なグローバルオプションを提供していません。だから、あなたはうーん、私は私の意図は、最後から最初に、他の言葉で、逆に捕らえグループを取得することでした、あなたが知っている、それを得たここwhile loop

int i = 0; 
while (matcher.find()) { 
    for (int j = 0; j <= matcher.groupCount(); j++) { 
     System.out.println("------------------------------------"); 
     System.out.println("Group " + i + ": " + matcher.group(j)); 
     i++; 
    } 
} 

Ideone Demo

+0

が必要これを行う方法? – developer033

+0

@developer033あなたは 'sample'と' [sample] 'を使いますか? – rock321987

+0

私は 'notworking'、' [notworking] '、' sample'と '[sample]'を使いたいです。だから私は捕獲されたすべての集団を集め、今私を理解したいのですか? – developer033

2

グループには複数の一致があるとは考えられません。彼らは、単一の一致のいくつかの部分を特定すると考えられている。式"([A-Za-z]*):([A-Za-z]*)"はキーと値のペアと一致し、グループ1のキーとグループ2の値を得ることができます。

式には1つのグループ(=角括弧のペア)しかないため、グループ0 (手動で定義されたグループとは無関係に常に一致した式全体)と1(定義した単一のグループ)が返されます。

より多くの一致が必要な場合は、findを繰り返し呼び出すようにしてください。

int i = 0; 
while (matcher.find()) { 
    System.out.println("Match " + i + ": " + matcher.group(1)); 
    i++; 
} 
関連する問題