我试着写一个正则表达式,在一个代表Go语言代码的字符串中,用一个更新后的名称,比如FooBar
,来替换一个类型的名称,比如Bar
,但是只在它在另一个结构体中作为字段的类型出现或者作为该类型的数组出现的地方。
type Foo struct {
Bar Bar
Baz []Bar
Bars []Bar
}
变成
type Foo struct {
Bar FooBar
Baz []FooBar
Bars []FooBar
}
到目前为止,我已经成功地使用ReplaceAllString
转换了数组字段类型:
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile(`(\w+)(\s+)\[\]Bar`)
s := `type Foo struct {
Bar Bar
Baz []Bar
Bars []Bar
}`
fmt.Println(re.ReplaceAllString(s, `$1$2[]FooBar`))
}
其产生
type Foo struct {
Bar Bar
Baz []FooBar
Bars []FooBar
}
缺少的是将Bar
替换为第一个字段的类型,也称为Bar
。我尝试将[]
设置为可选,如下所示:
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile(`(\w+)(\s+)(\[\])?Bar`)
s := `type Foo struct {
Bar Bar
Baz []Bar
Bars []Bar
}`
fmt.Println(re.ReplaceAllString(s, `$1$2$3FooBar`))
}
但这会产生一个所有字段类型都缺失的输出:
type Foo struct {
Bar
Baz
Bars
}
有人能指出这里的错误吗?(我可以使用两个不同正则表达式的两遍方法,但更喜欢一次完成)。
2条答案
按热度按时间vjhs03f71#
结果是第三个引用必须是
${3}
,而不是$3
:这产生了期望的结果
8zzbczxx2#
根据您的具体情况,
gofmt
可能是更好的选择:https://godocs.io/cmd/gofmt