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本体のソースにぶつかるしか。そのうちね、そのうち・・・。
ディスカッション
コメント一覧
Grails徹底入門2.6.3には書いたのですが、
======
switch (s) {
case c:
}
のとき、分岐の判断時にc.isCase(s) メソッドが呼び出され、その結果が真のときにそのcase
節が実行されます
=======
つまり、ご提示のswitch文に対応するisCase呼び出しは
println ((~/d{3}-d{4}/).isCase(zipCode))
です。