
Go 的 regexp 包支持通过 $1、$2 等语法引用捕获组实现字符串替换,不同于 Python 的 风格,需注意转义符号和方法选择。
go 的 `regexp` 包支持通过 `$1`、`$2` 等语法引用捕获组实现字符串替换,不同于 python 的 `` 风格,需注意转义符号和方法选择。
在 Go 中,使用正则表达式进行带捕获组的字符串替换非常常见,但其语法与 Python(如 re.sub(r"(d.*?)[a-z]+(d.*?)", r" ", ...))存在关键差异:Go 使用 $1、$2 而非 、 作为替换引用格式,且必须配合 Regexp.ReplaceAllString 或更灵活的 ReplaceAllStringFunc/ReplaceAllLiteralString 等方法。
以下是一个完整示例,对应你提供的 Python 逻辑:将 "123abc123" 中匹配 (d.*?)[a-z]+(d.*?) 的部分替换为 "第一组 第二组"(即 $1 $2):
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile(`(d.*?)[a-z]+(d.*)`)
result := re.ReplaceAllString("123abc123", "$1 $2")
fmt.Println(result) // 输出:123 123
}✅ 关键要点说明:
- 捕获组用
(...)定义,索引从 1 开始($0表示整个匹配,不常用); - 替换字符串中必须使用
$1、$2—— 不可写作或\1,否则会被当作字面量处理; -
ReplaceAllString是最常用方法,适用于简单字符串替换;若需对每个匹配做复杂处理,可结合FindAllStringSubmatch+ 手动拼接,或使用ReplaceAllStringFunc配合闭包; - 注意正则表达式字面量应使用反引号(
`)包裹,避免 Go 字符串转义干扰(例如\d在双引号中需写为\\d,而反引号中直接写d即可)。
⚠️ 常见陷阱提醒:
- 若正则未匹配任何内容,
ReplaceAllString直接返回原字符串,不会报错,建议先用re.MatchString()调试; -
$符号在替换字符串中有特殊含义,如需字面量$,请写为$$; -
ReplaceAllLiteralString不解析$引用,仅作纯文本替换,慎用于含捕获组场景。
总结:Go 的正则替换简洁高效,掌握 $n 语法、合理选用替换方法,并注意原始字符串书写方式,即可安全、准确地完成基于捕获组的文本重构任务。

















