Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在Golang正则表达式中,如何用参数替换所有?_Regex_Go - Fatal编程技术网

Regex 在Golang正则表达式中,如何用参数替换所有?

Regex 在Golang正则表达式中,如何用参数替换所有?,regex,go,Regex,Go,我使用的是Golang regex包,我想使用带有参数的regex ReplaceAllStringFunc,而不仅仅是源字符串 例如,我想更新此文本 "<img src=\"/m/1.jpg\" /> <img src=\"/m/2.jpg\" /> <img src=\"/m/3.jpg\" />" “” 至(将“m”更改为“a”或其他任何内容): “” 我想要一些类似于: func UpdateText(text string) string

我使用的是Golang regex包,我想使用带有参数的regex ReplaceAllStringFunc,而不仅仅是源字符串

例如,我想更新此文本

"<img src=\"/m/1.jpg\" />  <img src=\"/m/2.jpg\" />  <img src=\"/m/3.jpg\" />"
“”
至(将“m”更改为“a”或其他任何内容):

“”
我想要一些类似于:

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 + "\""
}
func UpdateText(文本字符串)字符串{
re,uxAE:=regexp.Compile(`
我检查了文档,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
}


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

感谢kostix的建议,下面是我使用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
}
func UpdateAllResourcePath(文本,前缀字符串)(字符串,错误){
doc,err:=goquery.NewDocumentFromReader(strings.NewReader(text))
如果错误!=零{
返回“”,错误
}
sel:=文件查找(“img”)
长度:=长度(选择节点)
对于索引:=0;索引<长度;索引++{
imgSrc,ok:=选择等式(索引).Attr(“src”)
如果!好的{
持续
}
newImgSrc,err:=UpdateResourcePath(imgSrc,prefix)//在此处更改imgSrc
如果错误!=零{
返回“”,错误
}
sel.Eq(index.SetAttr(“src”,newImgSrc)
}
newtext,err:=doc.Find(“body”).Html()
如果错误!=零{
返回“”,错误
}
返回新文本,无
}

< /代码>不,你不想用ReExxp处理HTML。@ Volker,UHMM,文本不是一个完整的HTML,它是一篇新闻文章的内容,你认为最好的解决方案是什么?我认为字符串。替换不能很容易地匹配一个模式。使用一个合适的HTML解析器。是一个选项,你可能会发现有用的。因为html5在很多情况下都可以使用,可能只是手动添加一个doctype和一个。或者解析为xml。当然它支持一个参数。你的问题很不清楚。>坏事情会发生
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
}