Groovy(Java)の正規表現って、前方参照で来たんだね
当然ですが、Groovy(Java)の正規表現も、 前方参照 の機能があるんですね。最近、 String の replaceAll メソッドを使用して気づいた。
例えば、こんなコードがあった場合
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
}
とか書いてしまう。
ディスカッション
コメント一覧
replaceAllによる置換での前方参照は、Java APIがもともともってる機能です。Groovy JDK, GDKの追加機能ではないです。
ただ、「マッチした部分文字列に処理を加えてその結果で置換する」といったケースにはこれでは対応できないので、クロージャを与えるケースが有用になってきます。
http://d.hatena.ne.jp/uehaj/20071010
>uehajさん
すでに素敵な投稿があったんですね。
uehajさんのブログ、大変勉強になります。
ありがとうございます。