こんにちは。KOUKIです。
とある企業で、Go言語を使ってWebシステムを開発しています。
開発経験は4年くらいあるのですが、正規表現が苦手です^^;
Go言語では、regexpパッケージを使うと正規表現の処理が書けます。本記事は、その備忘です。
最初にregexpの使い方を紹介して、最後に文中からURLを取得してみようと思います。
regexpの基礎
regexp.MatchString
最初に、簡単な正規表現を書いてみます。
1 2 3 4 5 6 7 8 9 10 11 |
package main import ( "fmt" "regexp" ) func main() { match, _ := regexp.MatchString("a([a-z]+)e", "apple") fmt.Println(match) } |
上記のMatchStringには、第一引数に正規表現パターン、第二引数に検索対象の文字列を入れます。これで正規表現処理がかけます。
「a([a-z]+)e」は、最初の文字が「a」、最後の文字が「e」、その間の文字が「a~z」の1個以上の文字列を検索します。
プログラムを実行してみましょう。
1 2 |
$ go run main.go true |
正規表現にマッチした場合は、trueが返却されます。逆にマッチしない場合は、falseが返却されます。
1 2 3 4 |
func main() { match, _ := regexp.MatchString("a([a-z]+)e", "banana") fmt.Println(match) } |
1 2 |
$ go run main.go false |
regexp.MustCompile
regexp.MustCompileは、正規表現のオプティマイズをしてくれます。正規表現のマッチングをプログラム内で何度も使いたい場合は、こちらを使った方がいいらしいです。
1 2 3 4 5 |
func main() { r := regexp.MustCompile("a([a-z]+)e") ms := r.MatchString("apple") fmt.Println(ms) } |
1 2 |
$ go run main.go true |
URLの正規表現
基本が分かったところで、URLの正規表現をやっていきましょう。
FindString
最初は、文中からではなく、URLの一部分を使った正規表現にチャレンジしましょう。
1 2 3 4 5 6 7 8 9 10 11 |
func main() { /* 1. ^ -> 先頭を指定(ここでは、/から始まることを意味する) 2. view or edit or saveが含まれている 3. a~Z or A~Z or 0~9 の1文字以上 4. $ -> 終わりを指定(ここでは、a~Z or A~Z or 0~9 のいずれか) */ r := regexp.MustCompile("^/(view|edit|save)/([a-zA-Z0-9]+)$") fs := r.FindString("/view/test") fmt.Println("Get URL:", fs) } |
FindStringは、正規表現でマッチした文字列を取得できます。
1 2 |
$ go run main.go Get URL: /view/test |
マッチしなかったら空の状態で返却されます。
1 2 3 4 5 6 |
func main() { r := regexp.MustCompile("^/(view|edit|save)/([a-zA-Z0-9]+)$") fs := r.FindString("/hoggehoge/test") fmt.Println("Get URL:", fs) } |
1 2 |
$ go run main.go Get URL: |
FindStringSubmatch
FindStringSubmatchを使うと以下のようなこともできます。
1 2 3 4 5 6 7 8 |
func main() { r := regexp.MustCompile("^/(view|edit|save)/([a-zA-Z0-9]+)$") fss := r.FindStringSubmatch("/view/test") fmt.Println("Get URL:", fss) fmt.Println("Get URL All:", fss[0]) fmt.Println("Get URL First:", fss[1]) fmt.Println("Get URL Second:", fss[2]) } |
1 2 3 4 5 |
$ go run main.go Get URL: [/view/test view test] Get URL All: /view/test Get URL First: view Get URL Second: test |
ご覧の通り、マッチした文字列の一部分を取得できます。
文中からURLを取得する
最後に、本記事の目的である文中からURLを取得する処理を実装してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package main import ( "fmt" "regexp" ) func main() { message := ` こんにちは。 http://localhost/hoge/hoge さようなら ` r := regexp.MustCompile("http(.*)://(.*)/(.*)/(.*)") fs := r.FindString(message) fmt.Println("Get URL: ", fs) } |
messageを文中とします。取得したいURLが「http://localhost/hoge/hoge」なので、正規表現パターンを「”http(.)://(.)/(.)/(.)”」にしました。
このパターンは、URLの状況によって変えてください。
プログラムを実行すると文中からURLのみ取得できたことがわかります。
1 2 |
$ go run main.go Get URL: http://localhost/hoge/hoge |
尚、「http(.*)」の(.*)は、httpsでも対応できるようにしています。
別パターンも作ってみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package main import ( "fmt" "regexp" ) func main() { message := ` こんにちは。 http://localhost/view/test さようなら ` r := regexp.MustCompile("http(.*)://([a-z]+)/(view|edit|save)/([a-zA-Z0-9]+)") fs := r.FindString(message) fmt.Println("Get URL: ", fs) } |
1 2 |
$ go run main.go Get URL: http://localhost/view/test |
便利ですね。
おわりに
Go言語のregexpパッケージを使えば、自由自在に文字列をとってこれそうですね。
まぁ、正規表現パターンが書ければですけど^^;
それでは、また!
コメントを残す
コメントを投稿するにはログインしてください。