用于捕获Go中可选存在的组的正则表达式



我试图写一个正则表达式,在一个字符串表示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
}

最新更新