Go 範例:正規表示式

Go 提供對正規表示式的內建支援。以下是 Go 中一些常見正規表示式相關任務的範例。

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

這會測試某個樣式是否與某個字串相符。

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

上述我們直接使用字串樣式,但對於其他正規表示式任務,您需要編譯最佳化的 Regexp 結構。

    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))

提供非負整數作為這些函式的第二個引數將限制相符項的數量。

    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