GroovyのisCaseで正規表現がマッチしない?
GroovyのisCaseで正規表現を使おうとしてつまずいたのでメモっておく。
codehausを見てみると、
switchはどのように機能しているのか
case文は isCase(switchValue) メソッドを使ってcase値と 一致 するかを評価します。それはデフォルトでは equals(switch値) を呼び出します。Classや正規表現などのさまざまなタイプはそれをオーバーロードしているのです。
Groovy - Japanese Logical Branching
ですので、一致を判定するためのをクラスを独自で作ることができ、そのためには独自の一致判定方法を提供するために isCase(switch値) を追加すればよいのです。
ってことだったので
以下のようなコードを作成。
def num = "123-4567" switch (num) { case ~/\d{3}-\d{4}/: println "郵便番号" break default: println "他の何か" break } println num.isCase(~/\d{3}-\d{4}/)
実行結果*1
他の何か
false
うーん…
case ~/\d{3}-\d{4}/:
には、いい感じにマッチするくせに、なぜか
println num.isCase(~/\d{3}-\d{4}/)
にはマッチしてくれない。
2008-12-08追記
id:uehajさんにご指摘いただきました。ありがとうございます。
逆だったんですね。
numの#isCaseが呼ばれるわけではなく、正規表現文字列の#isCaseが呼ばれるわけですね。
println ( (~/\d{3}-\d{4}/).isCase(num) )
としたところ、正しい結果が得られました。
*1:動作確認:Groovy 1.5.6