为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
富国沪深 2022-01-17 19:54:40
我正在使用 Golang 正则表达式包,我想使用带有参数的正则表达式 ReplaceAllStringFunc,而不仅仅是源字符串。例如,我想更新此文本"<img src=\"/m/1.jpg\" />  <img src=\"/m/2.jpg\" />  <img src=\"/m/3.jpg\" />"To(将“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 不支持参数,但是实现我的目标的最佳方法是什么?更一般地说,我想找到一个模式的所有出现,然后用一个由源字符串+一个新参数组成的新字符串更新每个模式,有人能给出任何想法吗?
查看完整描述

2 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

我同意这些评论,你可能不想用正则表达式解析 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

}


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


查看完整回答
反对 回复 2022-01-17
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

这是我使用 html 解析器的解决方案。


func UpdateAllResourcePath(text, prefix string) (string, error) {

    doc, err := goquery.NewDocumentFromReader(strings.NewReader(text))

    if err != nil {

        return "", err

    }


    sel := doc.Find("img")

    length := len(sel.Nodes)

    for index := 0; index < length; index++ {

        imgSrc, ok := sel.Eq(index).Attr("src")

        if !ok {

            continue

        }


        newImgSrc, err := UpdateResourcePath(imgSrc, prefix)    // change the imgsrc here

        if err != nil {

            return "", err

        }


        sel.Eq(index).SetAttr("src", newImgSrc)

    }


    newtext, err := doc.Find("body").Html()

    if err != nil {

        return "", err

    }


    return newtext, nil

}


查看完整回答
反对 回复 2022-01-17
  • 2 回答
  • 0 关注
  • 194 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信