正規表現のグルーピングで文字を抜き出す
正規表現のグルーピングとは?
正規表現は入力のバリデーション (入力検証) のために、パターンにマッチするか否かチェックするという使用方法が主な用途のひとつとして挙げられます。
そのほか、正規表現のグルーピングを使うと、パターンマッチするか否かチェックするだけではなく、マッチした箇所を取り出すことができます。
グルーピングというのは、正規表現のパターンの中で括弧 () を使い、ひとまとめにする場所を指定することです。
例えば、パターン [A-Z]{2}\d+ の中で二つ () を使って、 ([A-Z]{2})(\d+) とグルーピングします。
すると、マッチした箇所の前半のアルファベット部分 ([A-Z]{2}) と、後半の数字部分 (\d+) でそれぞれグループ分けされた状態で文字を取り出すことができます。
正規表現のグルーピングの具体例
次の例をみてください。
package com.keicode.java.test;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TestApp {
public static void main(String[] args) {
Pattern p = Pattern.compile("([A-Z]{2})(\\d+)");
Matcher m = p.matcher("AB123XYZMN456ABC");
int groupCount = m.groupCount();
while (m.find()) {
for (int i = 0; i <= groupCount; i++) {
System.out.println(i + ": " + m.group(i));
}
}
}
}
パターン文字列は "([A-Z]{2})(\\d+)" としています。
パターン中のひとつ目のグループは ([A-Z]{2}) です。 これは「大文字のアルファベットが2個」にマッチします。
ふたつ目のグループは (\\d+) です。 \d は digit すなわち数字を表す文字クラスです。 + は「ひとつ以上」という意味です。
よって、 [A-Z]{2}\d+ というパターンは、「大文字のアルファベット2個に続き数字が続く」ところにマッチします。
マッチしたうち、ひとつ目のグループとしてアルファベットの大文字の部分が、二つ目のグループとして数字の部分が取り込まれることになります。
上のコードの実行結果は次の通りです。
0: AB123
1: AB
2: 123
0: MN456
1: MN
2: 456
グループ化されたパターン文字列でマッチしたときには、group のインデックス 0 にマッチした部分全体が、インデックス 1, 2, ... にグループのインデックス毎にマッチした箇所が設定されます。
ここでは () が二つなので、グループインデックスは最大 2 です。
group(0) でマッチした箇所全体が設定され (ここでは AB123 や MN456)、group(1) にグループ 1 の内容 (AB や MN)、group(2) にグループ 2 の内容 (123 や 456) がそれぞれ設定されていることが分かります。