在线文档 > 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’ 包文档。