Golang 正则表达式教程

GolangGolangBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本实验展示了如何在 Go 语言中使用正则表达式。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL go(("`Golang`")) -.-> go/AdvancedTopicsGroup(["`Advanced Topics`"]) go/AdvancedTopicsGroup -.-> go/regular_expressions("`Regular Expressions`") subgraph Lab Skills go/regular_expressions -.-> lab-15502{{"`Golang 正则表达式教程`"}} end

正则表达式

本实验要求你完成代码,以在 Go 语言中执行各种与正则表达式相关的任务。

  • 使用 regexp 包来执行与正则表达式相关的任务。
  • 使用 MatchString 来测试一个模式是否与字符串匹配。
  • 使用 Compile 来优化 Regexp 结构体。
  • 使用 MatchString 来像 Compile 那样测试匹配。
  • 使用 FindString 来查找正则表达式的匹配项。
  • 使用 FindStringIndex 来查找第一个匹配项,并返回匹配项的起始和结束索引,而不是匹配的文本。
  • 使用 FindStringSubmatch 来返回 p([a-z]+)ch([a-z]+) 的信息。
  • 使用 FindStringSubmatchIndex 来返回关于匹配项和子匹配项索引的信息。
  • 使用 FindAllString 来查找正则表达式的所有匹配项。
  • 使用 FindAllStringSubmatchIndex 来应用于输入中的所有匹配项,而不仅仅是第一个。
  • 使用 Match 来使用 []byte 参数测试匹配,并从函数名中去掉 String
  • 使用 MustCompile 来创建带有正则表达式的全局变量。
  • 使用 ReplaceAllString 用其他值替换字符串的子集。
  • 使用 ReplaceAllFunc 用给定函数转换匹配的文本。
$ 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`](https://pkg.go.dev/regexp) 包文档。

以下是完整代码:

// Go 为 [正则表达式](https://en.wikipedia.org/wiki/Regular_expression) 提供了内置支持。
// 以下是 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")))

	// 当用正则表达式创建全局变量时,你可以使用 `Compile` 的 `MustCompile` 变体。`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 语言中使用正则表达式来执行各种任务,例如测试一个模式是否与字符串匹配、查找正则表达式的匹配项以及用其他值替换字符串的子集。

您可能感兴趣的其他 Golang 教程