我试图写一个正则表达式,在一个字符串表示Go代码将取代一个类型的名称,说Bar
,与更新的名称,说FooBar
,但只有当它出现在另一个结构的字段的类型或作为该类型的数组。例如,我想转换为
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
}
怎么了?(我可以对两个不同的正则表达式使用两次传递的方法,但我更喜欢一次实现这一点)。
根据您的情况,gofmt
可能是一个更好的选择:
gofmt -r 'Bar -> FooBar' hello.go
文件hello.go
package hello
type Foo struct {
FooBar FooBar
Baz []FooBar
Bars []FooBar
}
https://godocs.io/cmd/gofmt
第三个引用需要是${3}
,而不是$3
:
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${3}FooBar`))
}
产生期望的结果
type Foo struct {
Bar FooBar
Baz []FooBar
Bars []FooBar
}