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 是一个空表达式。
我在 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 是一个空表达式。