2008/10/28

groovy(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") )

とかも

if( filename =~ /.*\.groovy/ )

とか書いてしまうし。

 

2 件のコメント:

  1. replaceAllによる置換での前方参照は、Java APIがもともともってる機能です。Groovy JDK, GDKの追加機能ではないです。

    ただ、「マッチした部分文字列に処理を加えてその結果で置換する」といったケースにはこれでは対応できないので、クロージャを与えるケースが有用になってきます。

    http://d.hatena.ne.jp/uehaj/20071010

    返信削除
  2. >uehajさん
    すでに素敵な投稿があったんですね。
    uehajさんのブログ、大変勉強になります。

    ありがとうございます。

    返信削除