regex - 如何用 Golang 正则表达式中的参数替换所有内容?

标签 regex go

我正在使用 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
}

see on playground

(请注意,我稍微更改了您的正则表达式以分别匹配文件扩展名)

关于regex - 如何用 Golang 正则表达式中的参数替换所有内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37919683/

相关文章:

regex - 如何从 Perl 中的连续行中检索值?

go - 理解 `interface{}` 在 Go 中的用法的问题

go - 创建存档排除基目录

go - 使用 ReplaceAllString 和 ToUpper 不起作用

http - 如何从授权 header 中提取 JWT

python - 正则表达式:根据附加的单词从列表中抓取项目

regex - 一行中双字符的奇数个 (GREP)

regex - Perl Regex 正则表达式匹配字符串除外,不匹配字符串

regex - 匹配算法还是正则表达式?

gob panic 解码接口(interface)