【问题标题】:Golang regex replace behaviorGolang 正则表达式替换行为
【发布时间】:2021-07-29 04:34:50
【问题描述】:

我在 Go 中有一个简单的正则表达式,在使用 ReplaceAllString 函数时发现了一个奇怪的行为。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    var re = regexp.MustCompile("(.*)(b.*)")
    fmt.Println(re.ReplaceAllString("abc", "$1,d"))
    fmt.Println(re.ReplaceAllString("abc", "$1d"))
    fmt.Println(re.ReplaceAllString("abc", "$1d.f"))
    fmt.Println(re.ReplaceAllString("abc", "$1 d"))
}

https://play.golang.org/p/reb0T9Eadw3

我期待这样的事情

a,d
ad
ad.f
a d

但实际结果是

a,d

.f
a d

我还在https://regex101.com/r/sROI28/1 测试了正则表达式,发现我的令牌替换语句是问题所在。但我并不完全理解根本问题。

我是否错误地使用了 $ 符号?我将如何调整我的替换字符串以达到预期/期望的输出?

【问题讨论】:

    标签: go regexp-replace


    【解决方案1】:

    问题是 1 之后的 d。您应该用大括号将组号括起来:

    package main
    
    import (
        "fmt"
        "regexp"
    )
    
    func main() {
        var re = regexp.MustCompile("(.*)(b.*)")
        fmt.Println(re.ReplaceAllString("abc", "${1},d"))
        fmt.Println(re.ReplaceAllString("abc", "${1}d"))
        fmt.Println(re.ReplaceAllString("abc", "${1}d.f"))
        fmt.Println(re.ReplaceAllString("abc", "${1} d"))
    }
    

    否则该组被扩展为 1d,这不是一个有效的组并返回一个空表达式。

    【讨论】:

      猜你喜欢
      • 2017-12-29
      • 2012-05-05
      • 1970-01-01
      • 2016-09-13
      • 2012-11-20
      • 1970-01-01
      • 2016-07-17
      • 2012-01-26
      • 1970-01-01
      相关资源
      最近更新 更多