私は何年もの間、主にperlで正規表現の実践者であり、次のような便利なことを行うことができます:
my $delim = qr#[-\:/]#; # basic enough
my $field1 = qr/(\d{8})/; # basic enough
my $field2 = qr/(?:one|two|three)(\d{8,10})/; # basic enough
...
my $re = qr/$field1${delim}$field2/; # beautiful magicks
while (<>) {
/$re/ and print "$1\n";
}
重要なのは、それらをプリコンパイルできるということではなく、ある正規表現を別の正規表現内で変数として使用して、実際に読み取り可能なより大きな複合正規表現を構築できるということです。個々の部分は単純なテスト データでテスト可能であり、複合は動的にすることができます (たとえば、$delim を引数としてサブルーチンに渡すことができます)。
問題は、Pattern/Matcher アプローチが主流である Java でこれにどのようにアプローチするかです。
ここに私の刺し傷があります:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
Pattern delim = Pattern.compile("[-\:/]");
Pattern field1 = Pattern.compile("(\d{8})");
Pattern field2 = Pattern.compile("(?:one|two|three)(\d{8,10})");
Pattern re_pat = Pattern.complle(
field1.pattern() + delim.pattern() + field2.pattern();
)
...
Matcher re = re_pat.matcher(input);
これは信頼できますか (落とし穴はありますか?)、それ以外の場合は Java の同等品として最適ですか? また、Groovy との関係で自由に答えてください。これは、このコードの最終的な目的地であるためです (しかし、Groovy は、基盤となる Java 正規表現の実装に多かれ少なかれ依存しているようです)。ありがとう。