Go 的 regexp 包功能完整、线程安全,支持匹配、提取(含命名分组)、全局查找(含迭代器)和替换,但不支持 PCRE 全部特性;推荐预编译正则以提升性能。

在 Go 语言中,regexp 包是处理正则表达式的标准库,功能完整、性能良好,且线程安全。它不支持 PCRE 的全部特性(比如回溯引用、条件断言),但覆盖了绝大多数日常匹配、提取、替换需求。
基础匹配:Check if string matches pattern
最常用的是判断字符串是否匹配某个正则模式:
- 用
regexp.MatchString(pattern, s)快速判断,返回bool和可能的错误(pattern 不合法时) - 若需复用正则(如高频匹配),先编译:
re := regexp.MustCompile(`\d{3}-\d{4}`),再调用re.MatchString(s) -
MustCompile在 pattern 错误时 panic,适合写死的正则;运行时生成的 pattern 应用Compile并检查 error
提取内容:Find submatches with named or numbered groups
匹配后提取子串,推荐用命名分组提升可读性:
- 定义命名组:
`(?P,然后用\d{4})-(?P \d{2})` re.FindStringSubmatchMap(s)(Go 1.22+)直接返回map[string]string - 旧版本可用
re.FindStringSubmatchIndex(s)获取字节位置,再手动切片;或用re.FindStringSubmatch(s)得到整个匹配及各组原始字节 - 若只取第一个匹配的子组,
re.FindStringSubmatch(s)返回[]byte切片数组,索引 0 是全匹配,1 是第一组,依此类推
全局查找与遍历:Find all matches iteratively
对一段文本找所有匹配项,避免一次性加载大量结果:
立即学习“go语言免费学习笔记(深入)”;
-
re.FindAllString(s, -1)返回所有匹配字符串的[]string;传数字可限制数量 -
re.FindAllStringSubmatch(s, -1)返回[][]byte,适合含二进制或非 UTF-8 数据的场景 - 更省内存的方式是用
re.FindIter(s)(Go 1.22+),返回迭代器,可 range 遍历每个*RegexpMatch
替换操作:Replace matched parts safely
替换支持字面量和函数式逻辑:
-
re.ReplaceAllString(s, "new")简单字面替换 -
re.ReplaceAllStringFunc(s, func(m string) string { return strings.ToUpper(m) })对每个匹配调用函数 - 带分组的替换用
re.ReplaceAllString(s, "[$1:$2]"),其中$1表示第一个捕获组(注意:Go 不支持\1,只认$1) - 若需动态构造替换内容(如按组名查 map),用
re.ReplaceAllStringFunc+ 手动FindStringSubmatch更灵活
基本上就这些。Go 的 regexp 设计克制,没有过度封装,学完核心几个方法就能覆盖 95% 场景。注意别在循环里反复 Compile,提前编译复用更高效。










