おそらく便利だと思っているんだけど、ちょっと調べた感じ無さそうだったので作った。
置き場所
コード:
https://github.com/umisama/go-regexpcache
インストール:
go get github.com/umisama/go-regexpcache
やってくれること
regexpの関数をラップしていて、使ったことのある正規表現の時はキャッシュからregexpを返してくれる。コンパイル時間がかからないのですぐにかえしてくれる。
一応、オフィシャルなregexpパッケージの関数と互換な仕様になっている。
import "github.com/umisama/go-regexpcache"
// 一回目なので普通にコンパイルされる
match := regexpcache.MustCompile("^[hc]at").MatchString("cat")
println(match)
// 2回以降はキャッシュからちゃっちゃと持ってくる
match = regexpcache.MustCompile("^[hc]at").MatchString("cat")
println(match)
動機
golangで文字列のバリデーションをする関数を作るみたいな事を考えた時に、正規表現を関数の中でコンパイルしていると処理時間がかかるので辛い。なので、コンパイルしたregexp.Regexpオブジェクトを、典型的にはグローバルに置くことになる。
var re = regexp.MustCompile("^[hc]at")
func varidation(str string) bool {
// regexp.Regexp object is global for avoid compile time
return re.MatchString(str)
}
ところがそうするとある関数でしか使わない変数でグローバルが汚れてしまってなんとなく気になります。それに、関数の中で難の正規表現とmatchを取ってるのかのわからなくなって、見通しが悪くなっているようにも思います。
そういうわけで、go-regexpcacheを使うとこういうことができます。
func varidation(str string) bool {
// You can write regexp inside function
return regexpcache.MustCompile("^[hc]at").MatchString(str)
}
たぶん便利だと思うんですが、便利だと思う方、お使いください。