Regex 在Golang正则表达式中,如何用参数替换所有?
我使用的是Golang regex包,我想使用带有参数的regex ReplaceAllStringFunc,而不仅仅是源字符串 例如,我想更新此文本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
"<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
}