Go 语言正则表达式
正则表达式用一段"模式串"去匹配文本,是校验、提取、清洗文本的利器。Go 标准库 regexp 提供完整支持,套路固定:先用 Compile(或 MustCompile)把模式编译成 Regexp 对象,再调用它的匹配、查找、替换、分割方法。(说明:片段需放入 main 函数并补 import 运行)
Compile 与 MustCompile
package main
import (
"fmt"
"regexp"
)
func main() {
re, err := regexp.Compile(`\d+`) // 编译失败时返回错误
if err != nil {
fmt.Println("模式错误:", err)
return
}
fmt.Println(re.MatchString("abc123")) // 输出:true(包含数字)
// MustCompile:模式写错直接 panic,适合包级别固定的模式
re2 := regexp.MustCompile(`\d+`)
fmt.Println(re2.MatchString("全是汉字")) // 输出:false
}
模式用反引号书写,\d 不必写成 \\d。MatchString 只判断"是否包含匹配",不管匹配位置。
FindString 与 FindAllString:查找
re := regexp.MustCompile(`\d+`)
fmt.Println(re.FindString("单价 25 元")) // 输出:25(第一个匹配)
fmt.Println(re.FindAllString("a1 b22 c333", -1)) // 输出:[1 22 333]
fmt.Println(re.FindAllString("a1 b22", 1)) // 输出:[1](限制数量)
fmt.Println(re.FindStringIndex("x12y")) // 输出:[1 3](起止位置)
分组:FindStringSubmatch
用括号 () 捕获分组,Submatch 返回"整体匹配 + 各分组":
re := regexp.MustCompile(`(\d{4})-(\d{2})-(\d{2})`)
m := re.FindStringSubmatch("日期:2024-05-01 发布")
fmt.Println(m) // 输出:[2024-05-01 2024 05 01]
下标 0 是整串,1、2、3 分别对应各组内容。
替换与分割:ReplaceAllString、Split
re := regexp.MustCompile(`\s+`) // 一个或多个空白
fmt.Println(re.ReplaceAllString("a b c", "-")) // 输出:a-b-c
sp := regexp.MustCompile(`[,;]`)
fmt.Println(sp.Split("a,b;c", -1)) // 输出:[a b c]
常见模式示例:手机号、邮箱、URL
phone := regexp.MustCompile(`^1[3-9]\d{9}$`) // ^ $ 锚定整串
fmt.Println(phone.MatchString("13800138000")) // 输出:true
fmt.Println(phone.MatchString("23800138000")) // 输出:false
email := regexp.MustCompile(`^[\w.]+@[\w.]+\.\w+$`)
fmt.Println(email.MatchString("go@example.com")) // 输出:true
urlRe := regexp.MustCompile(`https?://[^\s]+`)
fmt.Println(urlRe.FindString("官网 https://go.dev 见")) // 输出:https://go.dev
语法限制
Go 采用 RE2 引擎:线性时间、无灾难性回溯,安全高效;代价是不支持反向引用(\1)、环视(前瞻/后顾)等特性,遇到这类需求要改写为等价模式或用代码处理。
小结:regexp 的流程是 Compile/MustCompile 后调用 MatchString、Find(All)(String(Submatch))、ReplaceAllString、Split;配合手机号/邮箱/URL 等常用模式即可覆盖大多数文本处理。