uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

Groovyの正規表現はなぜ文字列か

Groovyでは/〜/で正規表現をあらわしますが、これはString型の定数であり、java.util.regex.Pattern型ではありません。直感的には、Pattern型であってもおかしくないですよね。

思うに、この理由は、Javaとの親和性を重視しているためです。

String#split()の引数や、String.replaceAll()の引数にはPattern型ではなくString型を渡す必要がありますが、//がもしPatternであれば、これらに正規表現を渡せないということになります。もちろん、別解としてはGroovy JDKでString#split(Pattern)やString#replaceAll(Pattern, String)を定義してやればよかったでしょうが、世にすでに存在するライブラリ群を扱う場合や、未来に出てくるJavaAPIと包括的に未来永劫にわたって互換性を保つためには/〜/の型はString型でしかありえません。

要は、Groovyで正規表現の指定が文字列型なのは、Javaがそうだからです。

この判断ひとつとっても、Groovyの言語設計が、立脚すべき基本方針を徹底的に貫くために、とことんまで考え抜いたものであることがわかります。その判断結果は、ときおり「美しくない」ように見えるときがあるのですが、「美しい」ということの意味は一つではないのだ、と身にしみて思います。「正しい」もまたそうであるように。