【Golang】正規表現チェックツールRegoについて

Go言語で正規表現のコードを書く際に、どういう表現ができるんだっけ?と思う時がありますよね。

Ruby(Ruby on Rails)の正規表現のコードを書く際はRubularというツールを使う方は多いと思いますが、Golangでも同じようなRegoという正規表現チェックツールがあって、よくそれを使っています。

regoio.herokuapp.com

使ってみる

f:id:moritamorie:20210119005710g:plain

分かりやすい対話的なインターフェースが便利です。

Regoを使うメリット

画面上のGo RegExp Quick Referenceに記載されている記法は Rubular とまったく同じなので一見Regoを使う必要はなさそうにみえます。

しかし、以下のRegoの実装のコードを見ると正規表現コンパイル・実行はGolangの実装で行っているので、Golangのプロジェクトの場合は事前にRegoで確認しておくと実際のコードの中で正規表現を使用した時に動かなくなる懸念が少なくて済みそうです。

https://github.com/stevedomin/rego/blob/master/rego.go#L38-L49

Regoで正規表現を決めた後は

正規表現を決めたら、コードの中で動かす前に、goreという対話シェル(REPL)を使って事前にRegexpの関数を動作確認しておくとスムーズです。(Regexpの様々な関数を使い慣れている方の場合は不要かと思います。)

というのもRegexpには挙動が分かりづらい関数も多く、例えば FindAllStringSubmatch を使って、以下の文字列からiMacという部分だけを抜き出すような場合、事前に関数の戻り値を把握しておきたいです。

アイマック(iMac)
r := regexp.MustCompile(`(\S+)\((\S+)\)`)
result := r.FindAllStringSubmatch("アイマック(iMac)", -1)
result[0][2] => "iMac"

ちなみにresultにはこんな値が入ります。

[][]string{
  []string{
    "アイマック(iMac)",
    "アイマック",
    "iMac",
  },
}