2008/12/04

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

GroovyのisCaseで正規表現がマッチしない? - No Programming, No Life

という投稿を見つけ、早速試してみる。ちょっとソースを修正して実行してみる。

def zipCode = "123-4567"
switch (zipCode) {
  case ~/\d{3}-\d{4}/:
    println "郵便番号"
    break
  default:
    println "他の何か"
    break
}
println zipCode.isCase(~/\d{3}-\d{4}/)

実行結果は

郵便番号
false

???ほんとだ。isCaseが聞いてない。Groovyがバグっているのかな??

println zipCode.isCase(/\d{3}-\d{4}/)でも

println zipCode.isCase("\\d{3}-\\d{4}")でも

だめっぽい。

もうちょっと色々出力してみる。

println zipCode.isCase(java.util.regex.Pattern.compile(/\d{3}-\d{4}/))
println java.util.regex.Pattern.compile(/\d{3}-\d{4}/).isCase(zipCode)
println (~/\d{3}-\d{4}/).isCase(zipCode)
println( (~/\d{3}-\d{4}/).class.name)

結果はそれぞれ

false
true
\d{3}-\d{4}
java.util.regex.Pattern

ううーん。なぜswitch文だとうまく判定してくれるんだ。こりゃ時間を見つけてgroovy本体のソースにぶつかるしか。そのうちね、そのうち・・・。

1 件のコメント:

  1. Grails徹底入門2.6.3には書いたのですが、

    ======
    switch (s) {
    case c:
    }
    のとき、分岐の判断時にc.isCase(s) メソッドが呼び出され、その結果が真のときにそのcase
    節が実行されます
    =======

    つまり、ご提示のswitch文に対応するisCase呼び出しは

    println ((~/\d{3}-\d{4}/).isCase(zipCode))

    です。

    返信削除