我想用正则表达式替换只有一个实例,而不是所有实例。我将如何使用Go的regexp
库?
输入:foobar1xfoobar2x
正则表达式:bar(.)x
替换:baz$1
ReplaceAllString
输出:foobaz1foobaz2
ReplaceOneString
输出:foobaz1foobar2x
答案 0 :(得分:8)
通常,如果您使用延迟匹配并使用锚点作为开头和结尾,则可以使用替换第一个行为:
replace `^(.*?)bar(.*)$` with `$1baz$2`.
示例:
package main
import (
"fmt"
"regexp"
)
func main() {
src := "foobar1xfoobar2x"
pat := regexp.MustCompile("^(.*?)bar(.*)$")
repl := "${1}baz$2"
output := pat.ReplaceAllString(src, repl)
fmt.Println(output)
}
<强>输出强>
foobaz1xfoobar2x
答案 1 :(得分:2)
我有同样的问题。我想出的最干净的解决方案:
package main
import (
"fmt"
"regexp"
"strings"
)
func main() {
re, _ := regexp.Compile("[a-z]{3}")
s := "aaa bbb ccc"
// Replace all strings
fmt.Println(re.ReplaceAllString(s, "000"))
// Replace one string
found := re.FindString(s)
if found != "" {
fmt.Println(strings.Replace(s, found, "000", 1))
}
}
运行:
$ go run test.go
000 000 000
000 bbb ccc
答案 2 :(得分:0)
我不能使用已接受的解决方案,因为我的模式非常复杂。 我最终使用了ReplaceAllStringFunc: https://play.golang.org/p/ihtuIU-WEYG
package main
import (
"fmt"
"regexp"
)
var pat = regexp.MustCompile("bar(.)(x)")
func main() {
src := "foobar1xfoobar2x"
flag := false
output := pat.ReplaceAllStringFunc(src, func(a string) string {
if flag {
return a
}
flag = true
return pat.ReplaceAllString(a, "baz$1$2")
})
fmt.Println(output)
}