Go (Golang) 正则表达式:初学者完整指南
正则表达式 (regex) 是一种强大的工具,用于根据指定模式搜索、提取和替换文本。在 Go (Golang) 语言中,通过标准包 regexp 实现正则表达式的操作。在本文中,我们将讲解在 Go 中使用 regexp 的基础知识,介绍关键函数,并提供实用示例,帮助您在项目中开始使用正则表达式。
什么是正则表达式,为什么在 Go 中需要它们?
正则表达式是一系列字符,定义了在文本中搜索的模式。例如,您可以检查字符串是否包含电子邮件、电话号码或特定数据格式。在 Go 中,regexp 包提供了用于编译模式、搜索匹配项、替换文本和提取子字符串的函数。
regexp 的主要功能:
- 搜索 — 检查是否存在与模式匹配的子字符串。
- 提取 — 获取所有匹配项或特定组。
- 替换 — 将找到的片段替换为其他文本。
- 验证 — 检查字符串格式(电子邮件、密码、URL)。
安装和导入 regexp 包
regexp 包是 Go 标准库的一部分,因此无需安装任何内容。要使用它,只需在文件开头导入它:
import ( "fmt" "regexp")1. 编译正则表达式:Compile 和 MustCompile
使用正则表达式的第一步是编译模式。在 Go 中有两种主要方法:
regexp.Compile(expr)— 返回编译后的表达式和错误(如果模式无效)。regexp.MustCompile(expr)— 类似,但在出错时引发恐慌 (panic)。适用于静态模式。
示例:
package main
import ( "fmt" "regexp")
func main() { // 使用 MustCompile,因为模式已知有效 re := regexp.MustCompile(`[a-z]+`) // 使用 Compile 并处理错误 re2, err := regexp.Compile(`[0-9]+`) if err != nil { fmt.Println("编译错误:", err) return } fmt.Println(re, re2)}2. 基本搜索和检查方法
编译后,我们得到一个 *regexp.Regexp 对象,其中包含一组方法。让我们看看最常用的方法。
MatchString — 检查匹配
方法 MatchString(s string) bool 如果字符串包含至少一个与模式匹配的子串,则返回 true。
re := regexp.MustCompile(`go`)fmt.Println(re.MatchString("golang")) // truefmt.Println(re.MatchString("python")) // falseFindString — 查找第一个匹配项
返回与模式匹配的第一个子字符串。
re := regexp.MustCompile(`[0-9]+`)fmt.Println(re.FindString("价格: 100 卢布, 折扣 20%")) // "100"FindAllString — 查找所有匹配项
返回所有找到的字符串的切片。第二个参数是最大匹配数(-1 表示全部)。
re := regexp.MustCompile(`[0-9]+`)result := re.FindAllString("价格: 100 卢布, 折扣 20%", -1)fmt.Println(result) // ["100", "20"]3. 使用子表达式提取组
模式中的圆括号创建捕获组。方法 FindStringSubmatch 返回一个切片,其中第一个元素是完整匹配,后续元素是组的值。
re := regexp.MustCompile(`(\\d{4})-(\\d{2})-(\\d{2})`)date := "日期: 2023-12-25"matches := re.FindStringSu