Java 入門

ホーム > Java の正規表現 (Regular Expression) > グルーピングで文字を抜き出す

グルーピングで文字を抜き出す

正規表現は入力のバリデーション (入力検証) のために、パターンにマッチするか否かという使用方法が主な用途として挙げられます。

その他正規表現の利用方法で特にパワフルなもののひとつに、文字列の中から特定のパターンにマッチした文字(あるいは部分)を抜き出すということが挙げられます。

パターンマッチするか否かというだけではなく、マッチした箇所を取り出すことができます。

グルーピング

文字を取り出すにはグルーピングを利用すると良いです。

パターン文字列の中に () でグループ化する部分を囲むことによって、グルーピングすることができます。

次の例をみてください。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegExpTest2 {

  public static void main(String[] args) {
    String s = "SN123 xyz SN456";
    String patternString = "SN(\\d+)";
    
    Pattern p = Pattern.compile(patternString);
    Matcher m = p.matcher(s);
    int g = m.groupCount();

    while(m.find()){
      for(int i=0; i<=g; i++){
        System.out.println(
          m.group(i)
        );
        
        //String t   = s.substring(
        //  m.start(i+1), m.end(i+1));
        //System.out.println(t);
      }
    }
  }

}

パターン文字列は SN(\d)+ としています。

\d は digit すなわち数字を表す文字クラスですから、SN(\d)+ は SN1 とか SN123 などにマッチします。

パターン文字列の中で、数字の部分が () で囲まれていますから、この部分がグルーピングされて取り出すことが可能になります。

上のコードの実行結果は次の通り。

SN123
123
SN456
456

グループ化されたパターン文字列でマッチしたときには、group のインデックス 0 にマッチした部分全体が、インデックス 1, 2, ... にグループのインデックス毎にマッチした箇所が設定されます。

ここでは () がひとつなので、グループインデックスは最大 1 です。

group(0) でマッチした箇所全体が設定され (ここでは SN123、SN456)、group(1) にグループ 1 の内容が設定されていることが分かります (ここでは 123, 456)。

start と end

なお、上記コード内にコメントアウトされていますが、start メソッドと end メソッドでグループ毎の文字の最初と最後の文字のインデックスを取得できます。

ホーム > Java の正規表現 (Regular Expression) > グルーピングで文字を抜き出す