Go による実例: 正規表現

Goでは正規表現に組み込みサポートを提供します。Goにおける一般的な正規表現関連のタスクの例をいくつか紹介します。

package main
import (
    "bytes"
    "fmt"
    "regexp"
)
func main() {

これはパターンが文字列と一致するかどうかをテストします。

    match, _ := regexp.MatchString("p([a-z]+)ch", "peach")
    fmt.Println(match)

上記では文字列パターンを直接使用しましたが、他の正規表現タスクには最適化されたRegexp構造体のCompileが必要です。

    r, _ := regexp.Compile("p([a-z]+)ch")

これらの構造体には、多くのメソッドがあります。以下では、前述のような一致テストです。

    fmt.Println(r.MatchString("peach"))

これは、正規表現の一致を検索します。

    fmt.Println(r.FindString("peach punch"))

これも最初のマッチを検索しますが、一致するテキストの代わりに、マッチの開始インデックスと終了インデックスを返します。

    fmt.Println("idx:", r.FindStringIndex("peach punch"))

Submatchバリアントには、全体パターンと、それらのパターン内での部分一致の両方の情報が含まれます。たとえば、これはp([a-z]+)ch([a-z]+)の両方の情報を返します。

    fmt.Println(r.FindStringSubmatch("peach punch"))

同様に、これは一致と部分一致のインデックスに関する情報を返します。

    fmt.Println(r.FindStringSubmatchIndex("peach punch"))

これらの関数のAllバリアントは、最初のマッチだけでなく、入力内のすべてのマッチに適用されます。たとえば、正規表現のすべてのマッチを検索するには。

    fmt.Println(r.FindAllString("peach punch pinch", -1))

これらのAllバリアントは、上記で見た他の関数にも使用できます。

    fmt.Println("all:", r.FindAllStringSubmatchIndex(
        "peach punch pinch", -1))

これらの関数に2番目の引数として負でない整数を指定すると、一致数が制限されます。

    fmt.Println(r.FindAllString("peach punch pinch", 2))

上記の例では文字列引数があり、MatchStringのような名前が使用されていました。また、[]byte引数を提供し、関数名からStringを削除することもできます。

    fmt.Println(r.Match([]byte("peach")))

正規表現を使用してグローバル変数を作成するときは、CompileMustCompileバリアントを使用できます。MustCompileはエラーを返さずにパニックを起こし、グローバル変数に安全に使用できます。

    r = regexp.MustCompile("p([a-z]+)ch")
    fmt.Println("regexp:", r)

regexpパッケージは、文字列の部分集合を他の値に置き換えるためにも使用できます。

    fmt.Println(r.ReplaceAllString("a peach", "<fruit>"))

Funcバリアントを使用すると、指定された関数を使用して一致したテキストを変換できます。

    in := []byte("a peach")
    out := r.ReplaceAllFunc(in, bytes.ToUpper)
    fmt.Println(string(out))
}
$ go run regular-expressions.go
true
true
peach
idx: [0 5]
[peach ea]
[0 5 1 3]
[peach punch pinch]
all: [[0 5 1 3] [6 11 7 9] [12 17 13 15]]
[peach punch]
true
regexp: p([a-z]+)ch
a <fruit>
a PEACH

Go正規表現の詳細なリファレンスについては、regexpパッケージのドキュメントを確認してください。

次の例:JSON