You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go 中 Regex:如何仅替换 capture group?

解决方案

要实现仅替换目标子串、保留周围字符的效果,问题出在你使用的正则替换逻辑上——ReplaceAllString默认会替换整个正则匹配的内容,而非单个捕获组。以下是修正后的实现:

方法一:捕获保留前后字符并引用分组

func main() {
    regex, _ := regexp.Compile("(://)(.*:.*)(@)")
    maskedValue := regex.ReplaceAllString("http://user:pass@domain.com/path", "$1****$3")
    fmt.Println(maskedValue)
}

运行输出:

http://****@domain.com/path

原理说明

  • 原正则://(.*:.*)@匹配的是完整的://user:pass@子串,替换时会把这整段内容换成****,导致前后字符直接拼接。
  • 修改后的正则(://)(.*:.*)(@)将需要保留的前缀://、目标子串.*:.*、后缀@拆分为三个捕获组。
  • 替换字符串中的$1和$3分别引用第一个和第三个捕获组的内容,中间用****替换目标子串,从而保留了周围的固定字符。

方法二:使用替换函数(灵活场景适用)

如果需要更灵活的处理逻辑,可以用ReplaceAllStringFunc直接返回保留前后字符的替换结果:

func main() {
    regex, _ := regexp.Compile("://(.*:.*)@")
    maskedValue := regex.ReplaceAllStringFunc("http://user:pass@domain.com/path", func(_ string) string {
        return "://****@"
    })
    fmt.Println(maskedValue)
}

内容的提问来源于stack exchange,提问作者Moshe Shaham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 11:20:33