用regexp替换一个匹配项

时间:2013-05-22 23:57:47

标签: regex go

我想用正则表达式替换只有一个实例,而不是所有实例。我将如何使用Go的regexp库?

输入:foobar1xfoobar2x
正则表达式:bar(.)x
替换:baz$1

ReplaceAllString输出:foobaz1foobaz2
ReplaceOneString输出:foobaz1foobar2x

3 个答案:

答案 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)
}