🗝️
GoLangのRegexpグループキャプチャ
はじめに
Golangでregular expression (regexp)
を使用する場合、regexp
パッケージを使用してパターンをコンパイルし、一致する箇所を検索します。
たとえば、メールアドレスからドメインを取得したい場合はどうでしょうか。
まず、パターンを見てみましょう:
pattern := `^[a-z0-9._%+\-]+@[a-z0-9.\-]+\.[a-z]{2,4}$`
グループを使用してコードを書き直す
グループ化するには、(
, )
という文字を使用します。これに名前を付けて、?P<名>
を使用してドメインを取得するのに役立ちます。
pattern := `^(?P<id>[a-z0-9._%+\-]+)@(?P<domain>[a-z0-9.\-]+\.[a-z]{2,4})$`
グループの部分を検索する
そして、コード内でFindStringSubmatch
関数を呼び出し、インデックスを使用して一致を取得します(インデックス1
から、なぜならインデックス0
には正規表現からの文字列一致が含まれているためです)。
package main
import (
"fmt"
"regexp"
)
func main() {
rgx := regexp.MustCompile(`^(?P<id>[a-z0-9._%+\-]+)@(?P<domain>[a-z0-9.\-]+\.[a-z]{2,4})$`)
emails := []string{
"test1@gmail.com",
"test2@hotmail.com",
"test3@yahoo.co.jp",
}
type email struct {
ID, domain string
}
dataEmails := make([]email, len(emails))
for i := range emails {
match := rgx.FindStringSubmatch(emails[i])
dataEmails[i] = email{ID: match[1], domain: match[2]}
}
fmt.Println(dataEmails)
}
一致するグループのキー(id
およびdomain
)を格納するためにmap[string]string
を使用し、int
の代わりにそれらを使用できます。
以上です!Happy Coding!
Discussion