技術向上

プログラミングの学び、気になるテクノロジーやビジネストレンドを発信

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を用いる、などが考えられるかと思います。