2011-12-06 20 views
0

したがって、正規表現を使用して文字列内のかっこ(カッコなど)の数を数えようとしています。私はこのメソッドを "groupCount"マッチャークラスで見つけました。だから私はこれが私を助けることができると思った。Java正規表現内の文字列の角括弧の数を数えるには

groupCountはJavaDocで "このメソッドによって返された値以下の負でない整数は、この正規表現の有効なグループインデックスであることが保証されています。"だから私は、文章は常に動作しなければならないと思うだろう

m.group(m.groupCount()); 

public class TestJavaBracketPattern { 

    public static void main(String[] args) { 
     Matcher m = Pattern.compile("(\\))").matcher(")"); 
     System.out.println(m.group(m.groupCount())); 
    } 

} 

は今ここに、私は正規表現で(\と呼ばれる)閉じ括弧に一致するように期待して)、シングルマッチを取得しています:間違った...

ここで私が書いたいくつかのテストコードです。正規表現は(\)) - これは閉じた括弧記号を含むグループと一致する必要があります。しかし、例外がスローされます(java.lang.IllegalStateException:一致するものが見つかりません)。

次に、私が一致しないところに一致を試みた:

public class TestJavaBracketPattern { 

    public static void main(String[] args) { 
     Matcher m = Pattern.compile("(\\))").matcher("("); 
     System.out.println(m.group(m.groupCount())); 
    } 

} 

私は同じ例外を取得します。実際、どちらの場合も、groupCountメソッドは1を返します。

非常に混乱しています。

+0

ドキュメントはこの上で非常に明確です。参照してください:http://docs.oracle.com/javase/1.5.0/docs/api/java/util/regex/Matcher.html#groupCount() –

答えて

1

以下はあまりにも実用的ですか?

@Test 
void testCountBrackets() { 
    String s = "Hello) how)are)you("; 
    System.out.println(s.length() - s.replaceAll("\\)", "").length()); // 3 
} 

(もちろん、これはあなただけのブラケットよりも複雑な現実のRE何かを検索することを想定しています。それ以外の場合は、単にs.replace(")","")を使用)

+0

実際には、これは一年中見た中で最もエレガントなものです – Kidburla

+0

ありがとう。しかし単体テストでは完全な失敗です:-) – mgaert

+0

それは失敗ではありません...私はそれを実行しようとし、成功(失敗ではない)を毎回報告します!! ;-) – Alderath

1

groupCountは、一致した結果ではなく、パターン内のグループ数を返します。

このような処理が必要です。

Matcher m = Pattern.compile("(\\))").matcher("Hello) how)are)you("); 
int count = 0; 
while (m.find()) { 
    count++; 
} 
System.err.format("Found %1$s matches\n", count); 
0

以下のコードを使用してください。

int count1 = StringUtils.countMatches("fi(n)d (i)n (the st)(ri)ng", "("); // '('

int count2 = StringUtils.countMatches("fi(n)d (i)n (the st)(ri)ng", ")"); //ための ')' の

int totalCount = count1+count2; 

StringUtilscommon-langライブラリに存在しています。

1

実際に検索を開始していないため、例外が発生します。

Matcher.groupCount()は、結果ではなく、パターン内のグループ数を返します。

Matcher.group()は、前回の一致時に指定されたグループによって取得された入力部分シーケンスを返します。

this pageを参照できます。

私は)

public class TestJavaBracketPattern { 

    public static void main(String[] args) { 
     Matcher m = Pattern.compile("(\\))").matcher(")"); 
     if (m.find()) {   
     System.out.println(m.group(m.groupCount())); 
     } 
    } 
} 

は(m.findを追加し、このようにあなたのコードを変更し、その結果は次のとおりです。

1 
) 
関連する問題