用regexp替换一个匹配项

用regexp替换一个匹配项,regex,go,Regex,Go,我只想用正则表达式替换一个实例,而不是全部实例。我如何使用Go的regexp库实现这一点 输入:foobar1xfoobar2x 正则表达式:bar(.)x 替换:baz$1 ReplaceAllString输出:foobaz1foobaz2 ReplaceOneStringoutput:foobaz1foobar2x通常,如果使用惰性匹配并使用锚定作为开始和结束,则可以使用replace first行为: replace `^(.*?)bar(.*)$` with `$1baz$2`. 例如

我只想用正则表达式替换一个实例,而不是全部实例。我如何使用Go的
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