假设我有像下面这样的字符串:
input := `bla bla b:foo="hop" blablabla b:bar="hu?"`
我想用一个函数替换在b:foo="hop"
或b:bar="hu?"
引号中的部分。
可以轻松构建正则表达式以获取匹配和子匹配,例如:
r := regexp.MustCompile(`\bb:\w+="([^"]+)"`)
然后调用ReplaceAllStringFunc
,但问题是回调函数接收的是整个匹配项而不是子匹配项:
fmt.Println(r.ReplaceAllStringFunc(input, func(m string) string {
// m is the whole match here. Damn.
}))
我该如何替换子匹配?
目前,我还没有找到比在回调函数中使用正则表达式分解m
并在处理子匹配后重建字符串更好的解决方案。
如果在Go语言中有正向零宽断言,我会使用另一种方法来处理,但那不是现实情况(而且也不应该是必要的)。
我该怎么办呢?
编辑:这是我的当前解决方案,我希望能够简化:
func complexFunc(s string) string {
return "dbvalue("+s+")" // this could be more complex
}
func main() {
input := `bla bla b:foo="hop" blablabla b:bar="hu?"`
r := regexp.MustCompile(`(\bb:\w+=")([^"]+)`)
fmt.Println(r.ReplaceAllStringFunc(input, func(m string) string {
parts := r.FindStringSubmatch(m)
return parts[1] + complexFunc(parts[2])
}))
}
让我困扰的是我必须要两次应用正则表达式。这不太对。