example1
package main
import (
"fmt"
"strings"
"unicode/utf8"
)
var str = "你好(hello)Go"
func one() {
fmt.Println(strings.Count(str, ""))
fmt.Println(strings.Count(str, "o"))
}
func two() {
fmt.Println(len(str))
fmt.Println(len([]byte(str)))
}
func three() {
fmt.Println(utf8.RuneCount([]byte(str)))
fmt.Println(utf8.RuneCountInString(str))
}
func four() {
var (
keys []int
strs []string
)
for key, i := range str {
keys = append(keys, key)
strs = append(strs, string(i))
}
fmt.Println(keys)
fmt.Println(strs)
}
func main() {
one()
two()
three()
four()
}
strings.count
strings.count(str,substr) 通常是统计str中出现substr的次数,但是如果substr为空,返回的结果 = RuneCountInString([]byte(str)) + 1
len
len 统计的是字节数量
统计兼容中文
如果要把中文算一个单位进行统计,请使用 utf8.RuneCount 类似的方法
range
对字符串的 range 是按照 rune 进行迭代的,所以 range的 key 有可能是不连续的
匹配中文
只要知道中文的取值范围,我们就能正确的使用正则来匹配中文,中文的unicode是从一(\u4e00)开始,到龥(\u9fa5)结束的,使用正则 + range 去匹配中文
package main
import (
"fmt"
"regexp"
)
var str = "我Go爱你"
func main() {
fmt.Println("\u4e00") //一
fmt.Println("\u9fa5") //龥
filterChineseStr(&str)
fmt.Println(str) //我爱你
}
func filterChineseStr(str *string) {
var newStr string
reg := regexp.MustCompile("^[\u4e00-\u9fa5]$")
for _, s := range *str {
if reg.MatchString(string(s)) {
newStr += string(s)
}
}
*str = newStr
}