用给定单词中的相应字符替换特定字符

时间:2015-05-18 22:39:48

标签: string replace go

我想用句子中的单词更改每次出现的'n' with 'm''a' with 'e'和另外10条规则。目前我正在为每一条规则调用后续方式:

word = strings.Replace(word, "n", "m", -1)
word = strings.Replace(word, "a", "e", -1)
.... and 10 more times 

在地图中给出的Go字符替换是否有更好的方法?

4 个答案:

答案 0 :(得分:5)

基本上这就是strings.Map()功能的用途。

  

Map返回字符串s的副本,其中所有字符都根据映射函数进行了修改。如果映射返回负值,则从字符串中删除该字符而不进行替换。

示例(在Go Playground上尝试):

func main() {
    fmt.Println(strings.Map(rules, "Try not to replace me"))
}

func rules(r rune) rune {
    switch r {
    case 'n':
        return 'm'
    case 'a':
        return 'e'
    default:
        return r
    }
}

输出:

Try mot to replece me

带地图

如果您有许多规则,可以缩短此代码:

var repMap = map[rune]rune{
    'a': 'e', 'n': 'm',
}

func rules2(r rune) rune {
    if r2, ok := repMap[r]; ok {
        return r2
    }
    return r
}

输出相同(Go Playground)。

答案 1 :(得分:3)

如果您尝试替换多个字母,那么strings.Replacer是一种非常有效的方式。

var r = strings.NewReplacer(
    "n", "m",
    "a", "e",
    "x", "ngma",
) // you can set it as a global variable and use it multiple times instead of creating a new one everytime. 

func main() {
    fmt.Println(r.Replace("ax is a nurderer"))
}

playground

答案 2 :(得分:0)

如何使用string_fromstring_to创建地图,然后在循环中应用它:

replacements := map[string]string{
    "n": "m",
    "a": "e",
}
for s_from, s_to := range(replacements){
    str = strings.Replace(str, s_from, s_to, -1)
}
通过这种方式,您可以轻松,紧凑地定义所有规则。你会得到像 Go Playground

这样的东西

答案 3 :(得分:0)

package main
import (
    "fmt"
    "strings"
)

func main() {
r := strings.NewReplacer("n", "m", "a", "e")
fmt.Println(r.Replace("Try not to replace me"))
}

结果:http://play.golang.org/p/kW6J0GFSML
文件:http://golang.org/pkg/strings/#NewReplacer