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
相关产品推荐
相关产品推荐

