用regexp替换一个匹配项
我只想用正则表达式替换一个实例,而不是全部实例。我如何使用Go的用regexp替换一个匹配项,regex,go,Regex,Go,我只想用正则表达式替换一个实例,而不是全部实例。我如何使用Go的regexp库实现这一点 输入:foobar1xfoobar2x 正则表达式:bar(.)x 替换:baz$1 ReplaceAllString输出:foobaz1foobaz2 ReplaceOneStringoutput:foobaz1foobar2x通常,如果使用惰性匹配并使用锚定作为开始和结束,则可以使用replace first行为: replace `^(.*?)bar(.*)$` with `$1baz$2`. 例如
regexp
库实现这一点
输入:foobar1xfoobar2x
正则表达式:
bar(.)x
替换:
baz$1
ReplaceAllString
输出:foobaz1foobaz2
ReplaceOneString
output:foobaz1foobar2x
通常,如果使用惰性匹配并使用锚定作为开始和结束,则可以使用replace first行为:
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
我不能使用公认的解决方案,因为我的模式非常复杂。 我最终使用了ReplaceAllStringFunc:
我也有同样的问题。我想出的最干净的解决方案是:
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
这取决于API。你现在用什么?这可能有助于我们为您阅读文档。@Qtax,我正在使用Go的regexp库。
ReplaceOneString
的等效api似乎不存在。您可以尝试使用@HamZaDzCyberDeV作为解决方法(没有彻底测试),这解决了这一问题,但我正在寻找通用解决方案。实际上,该解决方案非常通用。它将始终用替换项替换第一个匹配项,并保留后面的所有内容不变。如果组变量使用以下字符构成有效的标识符名称,则需要卷曲这些组变量,请参阅更新的回答将不在正则表达式的末尾附加一个(.*)
,以及一个合适的替换变量就足够了吗?
$ go run test.go
000 000 000
000 bbb ccc