LoginSignup
4
4

More than 5 years have passed since last update.

regexpをキャッシュしてくれるラッパーを作った

Last updated at Posted at 2015-04-17

おそらく便利だと思っているんだけど、ちょっと調べた感じ無さそうだったので作った。

置き場所

コード:
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)
}

たぶん便利だと思うんですが、便利だと思う方、お使いください。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4