在线文档  >   Golang练习   >   正则表达式

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

    // 如果要创建全局变量且使用了正则表达式,则可以使用 `MustCompile` 的变种版本。
    // `MustCompile` 会导致程序发生 panic 而不是返回一个错误,这使得它在创建全局变量时更加安全。
    r = regexp.MustCompile("p([a-z]+)ch")
    fmt.Println("regexp:", r)

    // `regexp` 包也可以用于替换字符串的子集为其他值。
    fmt.Println(r.ReplaceAllString("a peach", ""))

    // `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 
a PEACH

有关 Go 正则表达式的完整参考,请查看 ‘regexp’ 包文档。