regex(正規表現)【Go】
regex(正規表現)を扱うpackage、regexpを見ていきます。
match, _ := regexp.MatchString("([a-zA-Z0-9]+)le", "apple") // 第2引数に第1引数の正規表現文字列が含まれるかを、bool値で返す fmt.Println(match)
上記方法と同じ結果を返すのがこちらです。
mc := regexp.MustCompile("([a-zA-Z0-9]+)le") m1 := mc.MatchString("apple") m2 := mc.MatchString("maple") m3 := mc.MatchString("peanut") fmt.Println(m1, m2, m3)
regexp.MustCompile("")は、繰り返し再利用できるため、
同じ正規表現を適用する場合にはこちらを用いたほうが、高速に処理されます。
regexp.MustCompileのFindStringSubmatch("")は、
引数の中に対象の正規表現文字列が含まれる場合に、スライスを返します。
スライスの中身は、切り出した文字列全体と、正規表現を「()」で括った単位ずつの個数分の要素です。
()内に記載されていないものは、全体には含まれますが、単位要素には含まれません。
accURL := "https://hotelsClub.com/accounts/" mc := regexp.MustCompile("([a-zA-Z0-9]+)/(profile|reservations)") fss := mc.FindStringSubmatch(accURL + "karen/reservations/1") if fss != nil { for _, v := range fss { fmt.Println(v) // karen/reservations, karen, reservationsの順に出力。/は()内に無いため、出力されない } }
上記の例では、最後に出力をしていますが、
よくある処理としては、URLによって処理内容を変える際に、この正規表現パターンが用いられるようです。
なお、regexp.MustCompileを利用しているので、繰り返しmcを使うことができます。
fssとは別の変数に格納したり、for文を利用してgoroutineを用いる、などが考えられるかと思います。