如何在golang中替换字符串中的所有字符

7
package main

import (
    "fmt"
    "strings"
)

func main() {
    fmt.Println(strings.Replace("golang", "g", "1", -1))
}

如何将字符串"golang"(上述字符串)中的所有字符替换为*,使其看起来像"******"

请问您能否给我们更多的例子,说明您希望它如何运作? - icio
如果我得到一个字符串"INHERITED",我想把它转换成"*********"。 - vijay
1
你是指 strings.Replace("golang", "golang", "******", -1) 吗? - Nadh
2个回答

16
通过替换所有字符,您将获得一个具有相同字符计数但全部为“*”的 string。因此,只需构造一个具有相同字符长度但全部为'*'stringstrings.Repeat() 可以重复一个 string(通过连接)。
ss := []string{"golang", "pi", "世界"}
for _, s := range ss {
    fmt.Println(s, strings.Repeat("*", utf8.RuneCountInString(s)))
}

输出(在Go Playground上试一下):

golang ******
pi **
世界 **

注意,len(s)会给你字符串UTF-8编码形式的长度,因为这是Go在内存中存储字符串的方式。您可以使用utf8.RuneCountInString()来获取字符数。
例如,以下行:
fmt.Println(len("世界"), utf8.RuneCountInString("世界")) // Prints 6 2

使用 "世界" 作为字符串会输出 6 2, 因为这个字符串需要使用6个字节来编码(在UTF-8中),但只包含2个字符。


多字节字符的处理做得不错。 - photoionized

14

不使用正则表达式的简单方法:

https://play.golang.org/p/B3c9Ket9fp

package main

import (
    "fmt"
    "strings"
)

func main() {
    fmt.Println(strings.Repeat("*", utf8.RuneCountInString("golang")))
}

更符合您最初想法的内容:

https://play.golang.org/p/nbNNFJApPp

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(".")
    fmt.Println(re.ReplaceAllString("golang", "*"))
}

3
似乎应该将icza的回答设置为最佳答案,因为它考虑了字符串可能含有多字节符号。 - Peter Yeremenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接