用切片的值替换正则表达式匹配

Replace regular expression matches with values of a slice

我的目标是替换字符串中正则表达式的匹配项。我的代码:

func ReplaceBase64ToDecodedImage(data string) string {
imageSrc := make(chan []string)
go base64toPng(content, imageSrc)
result := <-imageSrc

fmt.Println("received string: ", result)
re := regexp.MustCompile(`data:image/png;base64,[^]+["']([^"']+)["']`)

s := re.ReplaceAllString(data, "slice replacement values")

return s
}

我正在通过通道将字符串片段流式传输到替换函数。在 Javascript 中,这可以使用 shift() 函数轻松完成:

const paragraph = 'This ??? is ??? and ???. Have you seen the ????';
const regex = /(\?\?\?)/g;
const replacements = ['cat', 'cool', 'happy', 'dog'];
const found = paragraph.replace(regex, () => replacements.shift());

console.log(found);

但我还没有在 go 中找到类似的东西,而且 ReplaceAllString() 不接受字符串切片。有没有办法在 golang 中实现这一目标?我是 golang 的新手,所以还不太了解它的功能。

您可以使用 *regexp.Regexp 上可用的 ReplaceAllStringFunc 功能。要像这样实现您在 JavaScript 中所做的类似功能:

input := "This ??? is ??? and ???. Have you seen the ????"
replacements := []string{"cat", "cl", "happyjaxvin", "dog"}
r, _ := regexp.Compile(`\?\?\?`)

res := r.ReplaceAllStringFunc(input, func(_ string) string {
    var repl string
    repl, replacements = replacements[0], replacements[1:]
    return repl
})

fmt.Println(res)

您可以通过 ReplaceAllStringFunc 方法执行此操作。使用这个我们可以创建一个方法来遍历切片和 return 每个值:


import (
    "fmt"
    "regexp"
)

func main() {
    paragraph := "This ??? is ??? and ???. Have you seen the ????"
    re := regexp.MustCompile(`(\?\?\?)`)
    replacements := []string{"cat", "cool", "happy", "dog"}
    count := 0
    replace := func(string) string {
        count++
        return replacements[count-1]
    }
    s := re.ReplaceAllStringFunc(paragraph, replace)
    fmt.Println(s)
}