gpt4 book ai didi

go - 如何从 regexp.ReplaceAllFunc 访问捕获组?

转载 作者:IT王子 更新时间:2023-10-29 01:19:58 28 4
gpt4 key购买 nike

如何从 ReplaceAllFunc() 内部访问捕获组?

package main

import (
"fmt"
"regexp"
)

func main() {
body := []byte("Visit this page: [PageName]")
search := regexp.MustCompile("\\[([a-zA-Z]+)\\]")

body = search.ReplaceAllFunc(body, func(s []byte) []byte {
// How can I access the capture group here?
})

fmt.Println(string(body))
}

目标是替换[PageName]<a href="/view/PageName">PageName</a> .

这是 Writing Web Applications 底部“其他任务”部分下的最后一个任务。转到教程。

最佳答案

我同意在您的函数内部访问捕获组是最理想的,我认为使用 regexp.ReplaceAllFunc 是不可能的。关于如何使用该功能执行此操作,我现在唯一想到的是:

package main

import (
"fmt"
"regexp"
)

func main() {
body := []byte("Visit this page: [PageName] [OtherPageName]")
search := regexp.MustCompile("\\[[a-zA-Z]+\\]")
body = search.ReplaceAllFunc(body, func(s []byte) []byte {
m := string(s[1 : len(s)-1])
return []byte("<a href=\"/view/" + m + "\">" + m + "</a>")
})
fmt.Println(string(body))
}

编辑

还有另一种方法我知道如何做你想做的事。您需要知道的第一件事是,您可以使用语法 (?:re) 指定非捕获组,其中 re 是您的正则表达式。这不是必需的,但会减少不感兴趣的匹配项的数量。

接下来要知道的是 regexp.FindAllSubmatcheIndex .它将返回 slice 的 slice ,其中每个内部 slice 代表给定正则表达式匹配的所有子匹配的范围。

有了这两件事,您就可以构建一些通用的解决方案:

package main

import (
"fmt"
"regexp"
)

func ReplaceAllSubmatchFunc(re *regexp.Regexp, b []byte, f func(s []byte) []byte) []byte {
idxs := re.FindAllSubmatchIndex(b, -1)
if len(idxs) == 0 {
return b
}
l := len(idxs)
ret := append([]byte{}, b[:idxs[0][0]]...)
for i, pair := range idxs {
// replace internal submatch with result of user supplied function
ret = append(ret, f(b[pair[2]:pair[3]])...)
if i+1 < l {
ret = append(ret, b[pair[1]:idxs[i+1][0]]...)
}
}
ret = append(ret, b[idxs[len(idxs)-1][1]:]...)
return ret
}

func main() {
body := []byte("Visit this page: [PageName] [OtherPageName][XYZ] [XY]")
search := regexp.MustCompile("(?:\\[)([a-zA-Z]+)(?:\\])")

body = ReplaceAllSubmatchFunc(search, body, func(s []byte) []byte {
m := string(s)
return []byte("<a href=\"/view/" + m + "\">" + m + "</a>")
})

fmt.Println(string(body))
}

关于go - 如何从 regexp.ReplaceAllFunc 访问捕获组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28000832/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com