我正在使用 Golang 正则表达式包,我想将正则表达式 ReplaceAllStringFunc 与参数一起使用,而不仅仅是与源字符串一起使用。
例如,我想更新这段文字
"<img src=\"/m/1.jpg\" /> <img src=\"/m/2.jpg\" /> <img src=\"/m/3.jpg\" />"
至(将“m”更改为“a”或其他任何内容):
"<img src=\"/a/1.jpg\" /> <img src=\"/a/2.jpg\" /> <img src=\"/a/3.jpg\" />"
我想要这样的东西:
func UpdateText(text string) string {
re, _ := regexp.Compile(`<img.*?src=\"(.*?)\"`)
text = re.ReplaceAllStringFunc(text, updateImgSrc)
return text
}
// update "/m/1.jpg" to "/a/1.jpg"
func updateImgSrc(imgSrcText, prefix string) string {
// replace "m" by prefix
return "<img src=\"" + newImgSrc + "\""
}
我查看了文档,ReplaceAllStringFunc 不支持参数,但实现我的目标的最佳方法是什么?
更一般地说,我想找到一个模式的所有出现,然后用一个新字符串更新每个模式,该新字符串由源字符串 + 一个新参数组成,有人能给出任何想法吗?
最佳答案
我同意评论,您可能不想用正则表达式解析 HTML(会发生不好的事情)。
但是,假设它不是 HTML,并且您只想替换子匹配项。你可以这样做
func UpdateText(input string) (string, error) {
re, err := regexp.Compile(`img.*?src=\"(.*?)\.(.*?)\"`)
if err != nil {
return "", err
}
indexes := re.FindAllStringSubmatchIndex(input, -1)
output := input
for _, match := range indexes {
imgStart := match[2]
imgEnd := match[3]
newImgName := strings.Replace(input[imgStart:imgEnd], "m", "a", -1)
output = output[:imgStart] + newImgName + input[imgEnd:]
}
return output, nil
}
(请注意,我稍微更改了您的正则表达式以分别匹配文件扩展名)
关于regex - 如何用 Golang 正则表达式中的参数替换所有内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37919683/