Go 示例: 正则表达式

Go 内置支持 正则表达式。以下是一些 Go 中常见正则表达式相关任务的示例。

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

这测试一个模式是否匹配一个字符串。

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

上面我们直接使用字符串模式,但对于其他正则表达式任务,您需要Compile一个优化的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