読者です 読者をやめる 読者になる 読者になる

No Programming, No Life

新しいNPNLです。http://d.hatena.ne.jp/fumokmm/ から引っ越してきました。

GroovyのisCaseで正規表現がマッチしない?

GroovyのisCaseで正規表現を使おうとしてつまずいたのでメモっておく。

codehausを見てみると、

switchはどのように機能しているのか

case文は isCase(switchValue) メソッドを使ってcase値と 一致 するかを評価します。それはデフォルトでは equals(switch値) を呼び出します。Classや正規表現などのさまざまなタイプはそれをオーバーロードしているのです。
ですので、一致を判定するためのをクラスを独自で作ることができ、そのためには独自の一致判定方法を提供するために isCase(switch値) を追加すればよいのです。

Groovy - Japanese Logical Branching

ってことだったので

以下のようなコードを作成。

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