假设我有类似的字符串
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])
}))
}
困扰我的是我必须应用正则表达式两次。这听起来不对。