如何用Go regexp中的计数器替换出现的字符串?

时间:2015-01-11 12:46:05

标签: regex go

例如,在这句话中,

Let freedom ring from the mighty mountains of New York. Let freedom ring from the heightening Alleghenies of Pennsylvania. Let freedom ring from the snow-capped Rockies of Colorado. Let freedom ring from the curvaceous slopes of California.

如何用

替换“让自由

“[1]让自由”, “[2]让自由2”等等。

我搜索了Go regexp包,未能找到任何相关的增加计数器。 (只找到ReplaceAllStringFunc,但我不知道如何使用它。)

2 个答案:

答案 0 :(得分:2)

你需要这样的东西

r, i := regexp.MustCompile("Let freedom"), 0
r.ReplaceAllStringFunc(input, func(m string) string {
   i += 1
   if i == 1 {
     return "[1]" + m 
   }
   return fmt.Sprintf("[%d] %s%d", i, m, i)
})

确保您已导入所需的软件包..上述工作方法是使用Let freedom作为正则表达式,然后使用某些条件返回预期的内容。

答案 1 :(得分:0)

你需要以某种方式在你的函数的连续调用之间共享计数器。一种方法是构造闭包。你可以这样做:

package main

import (
    "fmt"
    "regexp"
)

func main() {
    str := "Let freedom ring from the mighty mountains of New York. Let freedom ring from the heightening Alleghenies of Pennsylvania. Let freedom ring from the snow-capped Rockies of Colorado. Let freedom ring from the curvaceous slopes of California."
    counter := 1
    repl := func(match string) string {
        old := counter
        counter++
        if old != 1 {
            return fmt.Sprintf("[%d] %s%d", old, match, old)
        }
        return fmt.Sprintf("[%d] %s", old, match)
    }
    re := regexp.MustCompile("Let freedom")
    str2 := re.ReplaceAllStringFunc(str, repl)
    fmt.Println(str2)
}