0

java.util.regex(jdk 1.6)を使用201210(\d{5,5})Testすると、サブジェクト文字列に適用される正規表現は、次のコードを前提として、(パターン)をキャプチャする20121000002Testだけで、キャプチャgroup(0)しません。group(1)00002

Pattern p1 = Pattern.compile("201210(\\d{5,5})Test");
Matcher m1 = p1.matcher("20121000002Test");

if(m1.find()){

    for(int i = 1; i<m1.groupCount(); i++){         
    System.out.println("number = "+m1.group(i));            
    }
}

201210(\d{5,5})Test(\d{1,10})不思議なことに、サブジェクト文字列に適用されるような別の同様の正規表現は、20121000002Test0000000099グループ0と1をキャプチャしますが、グループ2はキャプチャしません。

それどころか、JavaScriptのRegExpオブジェクトを使用することにより、まったく同じサブジェクト文字列に適用されたまったく同じ正規表現が、予想どおりにすべてのグループをキャプチャします。これらのオンラインテスターを使用して、この事実を自分で確認し、再確認しました。

私はここで何か間違ったことをしていますか?それとも、Javaの正規表現ライブラリが本当にひどいのですか?

4

5 に答える 5

1

m1.groupCount()キャプチャグループの数を返します。最初のケースでは1なので、このループには入りませんfor(int i = 1; i<m1.groupCount(); i++)

そのはずfor(int i = 1; i<=m1.groupCount(); i++)

于 2012-10-20T15:45:06.760 に答える
1

行を変更します

for(int i = 1; i<m1.groupCount(); i++){     

for(int i = 1; i<=m1.groupCount(); i++){      //NOTE THE = ADDED HERE    

今ではチャームとして機能します!

于 2012-10-20T15:43:42.160 に答える
0

java.util.regex.MatchResult.groupCountから:

グループゼロは、慣例によりパターン全体を示します。このカウントには含まれていません。

したがって、を繰り返しますgroupCount() + 1

于 2012-10-20T15:45:23.437 に答える
0

サブジェクト文字列「20121000002Test」に適用される正規表現「201210(\ d {5,5})Test」は、group(0)のみをキャプチャし、group(1)はキャプチャしません。

マニュアルも読んでいないと言えますが、読んだらMatcher.groupCount()と書いてあります。

このマッチャーのパターンのキャプチャグループの数を返します。グループゼロは、慣例によりパターン全体を示します。このカウントには含まれていません。

于 2012-10-20T15:37:01.287 に答える
0
for (int i = 1; i <= m1.groupCount(); i++) { 
                   ↑
              your problem
于 2012-10-20T15:39:21.957 に答える