正则表达式来捕获Go语言中可选的组,

igetnqfo  于 2023-01-15  发布在  Go
关注(0)|答案(2)|浏览(109)

我试着写一个正则表达式,在一个代表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 
}

有人能指出这里的错误吗?(我可以使用两个不同正则表达式的两遍方法,但更喜欢一次完成)。

vjhs03f7

vjhs03f71#

结果是第三个引用必须是${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
}
8zzbczxx

8zzbczxx2#

根据您的具体情况,gofmt可能是更好的选择:

> gofmt -r 'Bar -> FooBar' hello.go
package hello

type Foo struct {
        FooBar FooBar
        Baz    []FooBar
        Bars   []FooBar
}

https://godocs.io/cmd/gofmt

相关问题