Java正規表現-groupメソッドの詳細

3531 ワード

キャプチャグループは、かっこ内の文字をグループ化することによって作成される複数の文字を個別のユニットとして処理する方法です.
たとえば、正規表現(dog)は、「d」、「o」、および「g」を含む単一のグループを作成します.
キャプチャグループは、括弧を左から右に計算することによって番号付けされます.たとえば、式(A)(B(C))では、次の4つのグループがあります.
  • ((A)(B(C)))
  • (A)
  • (B(C))
  • (C)

  • matcherオブジェクトのgroupCountメソッドを呼び出すことで、式のパケット数を確認できます.groupCountメソッドは、matcherオブジェクトに現在複数のキャプチャグループがあることを示すint値を返します.
    Java正規表現の関連クラスMatcherには、次のような方法があります.
    - int groupCount() 
    - String group(int group) 
    - int start(int group) 
    - int end(int group) 
    - String group(String name) 
    - int start(String name) 
    - int end(String name)

    例Demo 1:
    String text = "John writes about this, and John Doe writes about that,"
                    + " and John Wayne writes about everything.";
    String patternString = "(John) (.+?) ";
    Pattern pattern = Pattern.compile(patternString);
    Matcher matcher = pattern.matcher(text);
    matcher.find();//     ,              
    int start = matcher.start();//                      
    int end = matcher.end();//                              
    System.out.println("found group: group(0) is '" + matcher.group(0));
    System.out.println("found group: group(1) is '" + matcher.group(1) + "',group(2) is '" + matcher.group(2)+"'");
    
    patternString= "(?:John)";
    Pattern pattern = Pattern.compile(patternString);
    Matcher matcher = pattern.matcher(text);
    System.out.println("groupCount is -->" + matcher.groupCount());
    while (matcher.find()) {
        System.out.println("found: " + matcher.group(1));
    }
    

    実行結果:
    found group: group(0) is ‘John writes 
    found group: group(1) is ‘John’,group(2) is ‘writes’
    groupCount is –>0 
    Exception in thread “main” java.lang.IndexOutOfBoundsException: No group 1

    出力結果から、正規表現が複数のグループを含む場合、すなわち複数の'(pattern)'形式を含むサブ表現である場合、そのグループインデックス(グループnumber)は1から始まり、グループ(0)は一致する文字列全体を表す. 
    まとめ:(1)正規表現で'()'でマークされたサブ表現が一致する内容はグループ(group)であり、グループインデックスは1から始まり、0は正規表現が一致する文字列全体を表し、group(i)はi番目のグループが一致する内容を表す. 
    (2)groupCount()関数は、現在の正規表現のグループ数を返します.
    (3)(?:pattern)形式に類似したサブエクスプレッションは1つのパケットとは言えない.
    例Demo 2:
    String text = "John writes about this, and John Doe writes about that,"
                    + " and John Wayne writes about everything.";
    String patternString = "(John) (.+?) ";
    Pattern pattern = Pattern.compile(patternString);
    Matcher matcher = pattern.matcher(text);
    matcher.find();//     ,              
    int start = matcher.start();//                      
    System.out.println(start);//0
    int end = matcher.end();//                              
    System.out.println(end);//12
    start = matcher.start(1);//          ,   John       ,0
    System.out.println(start);//0
    start = matcher.start(2);//          ,   writes       ,5
    System.out.println(start);//5
    end = matcher.end(1);//          ,   John       ,4
    System.out.println(end);//4
    end = matcher.end(2);//          ,   writes       ,12
    System.out.println(end);//12
    start = matcher.start(3);//Exception in thread "main" java.lang.IndexOutOfBoundsException: No group 3
    

    要約:(1)インデックスが正規表現に実際に存在するインデックスの数、すなわちgroupCount()の戻り値より大きい場合、例外が放出されます. 
    (2)int start(int group)は、現在のパケットが一致する文字列の元のターゲット文字列における位置を返す.
    (3)現在のパケットが一致する文字列の最後の文字の元のターゲット文字列におけるインデックス位置を返す.
    参照リンク:
          1.https://blog.csdn.net/yin380697242/article/details/52097679
          2.http://www.runoob.com/java/java-regular-expressions.html