正規表現の最後はJakarta OROのPerl正規表現を使ってみます。OROにはPerl正規表現以外にAWKの正規表現を扱うこともできます。Perlの方が正規表現のパターンで使える表記方法が多いのですが、場合によってはAWKの正規表現の方が都合が良い場合もあるので、両方用意されているのでしょう。
OROの正規表現の処理には、org.apache.oro.text.regex
パッケージのクラス、インタフェースを使用します。大体の使い方は他の正規表現ライブラリと同じです。まず、文字列で表されている正規表現からPatternオブジェクトを作成します。PatternオブジェクトはPatternCompilerで作成するのですが、Perl正規表現の場合はPerl5Compilerクラスのインスタンスを使います。
String regexString = "(([a-zA-Z_])([a-zA-Z_0-9]*)";
PatternCompiler compiler = new Perl5Compiler();
Pattern pattern = compiler.compile(regexString);
パターンマッチングを行いたい対象の文字列はPatternMatcherInputオブジェクトにしておきます。このオブジェクトは文字列や文字の配列から作成することができます。パターンマッチの処理の本体はPatternMatcherオブジェクトが行います。Perl正規表現のPatternを扱うには必ずPerl5Matcherオブジェクトを使います。
String target = "PatternCompilerでPatternオブジェクトをつくり、PatternMatcherオブジェクトで処理します。";
PatternMatcherInput input = new PatternMatcherInput(target);
PatternMatcher matcher = new Perl5Matcher();
while (matcher.contains(input, pattern)) {
MatchResult result = matcher.getMatch();
System.out.println(result.group(0));
}
マッチした部分の情報はMatchResultオブジェクトとして取り出すことができます。()を使ってパターンを参照する機能も他の正規表現ライブラリと同様に扱うことができます。 while (matcher.contains(input, pattern)) {
MatchResult result = matcher.getMatch();
System.out.println(result.group(0));
int n = result.groups();
System.out.println(n);
for (int i = 0; i < n; i++) {
System.out.println(i + ":" + result.group(i));
}
}
containtsメソッドを使うとPatternMatcherInputオブジェクトがカレント位置を覚えておいてくれるので、外部で管理する必要はありません。
個人的にはOROの正規表現ライブラリが一番好きなのですが、貴方はどうでしょうか。