Golang 正则表达式替换行为

Golang regex replace behavior

我在 Go 中有一个简单的正则表达式,并且在使用 ReplaceAllString 函数时注意到一个奇怪的行为。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    var re = regexp.MustCompile("(.*)(b.*)")
    fmt.Println(re.ReplaceAllString("abc", ",d"))
    fmt.Println(re.ReplaceAllString("abc", "d"))
    fmt.Println(re.ReplaceAllString("abc", "d.f"))
    fmt.Println(re.ReplaceAllString("abc", " 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 测试了正则表达式,发现我的令牌替换语句是问题所在。但是我不完全理解潜在的问题。

我是否错误地使用了 $ 符号?我将如何调整我的替换字符串以获得 expected/desired 输出?

问题是1后面的d。你应该用花括号把组号括起来:

package main

import (
    "fmt"
    "regexp"
)

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

否则该组将扩展到 1d,这不是有效组并且 returns 是一个空表达式。