Groovy(Java)の正規表現って、前方参照で来たんだね

2020-05-07Groovy,Java

当然ですが、Groovy(Java)の正規表現も、 前方参照 の機能があるんですね。最近、 StringreplaceAll メソッドを使用して気づいた。

例えば、こんなコードがあった場合

def text = 'こんにちわせかいにちげつか'
println text.replaceAll(/.((にち).)/, /$1/)

実行結果は こにちわせかにちげつか となります。
置換対象文字列の括弧の中身は、置換後文字列内から左から$1、$2、...のように参照可能。

したがって、以下のコードを実行すると、カッコの中のカッコを参照できます。

def text = 'こんにちわせかいにちげつか'
println text.replaceAll(/.((にち).)/, /$2/)

実行結果は こにちせかにちつか となります。

括弧が入れ子になった場合には、開き括弧の出現順に$1、$2と参照可能。

Groovyの場合はreplaceAllメソッドの第二引数にクロージャ渡すことも可能なので、

println text.replaceAll(/.((にち).)/, { all, x1, x2 ->
    x2
})

なんてのももちろん出きるけど、簡単な置換は前述の記述の方がスマートかなと思う。
最近、オライリーの正規表現(別名、ふくろう本を読んで知った.。正規表現を一度知ると、何でも正規表現使いたくなってしまう。

例えば

if (filename.endsWith('.groovy')) {
    // any logics
}

とかも

if (filename =~ /.*.groovy/) {
    // any logics
}

とか書いてしまう。

2020-05-07Groovy,Java