🗝️

GoLangのRegexpグループキャプチャ

2024/01/16に公開

はじめに

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