我想用句子中的单词更改每次出现的'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字符替换是否有更好的方法?
答案 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"))
}
答案 2 :(得分:0)
如何使用string_from
,string_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