如何从golang中的一串符文中获取子串?
How to get a substring from a string of runes in golang?
我找到了这个,https://groups.google.com/forum/#!topic/golang-nuts/YyKlLwuWt3w但据我所知,这些解决方案对我不起作用。
如果使用将字符串视为切片的方法(str[:20]
),它会在字符中间中断,我们得到“ال�”。
编辑:我相信我可以编写一个函数并将其作为 3 的倍数来执行,因为符文是 int32(32 位/(8 位/字节))。我首先要检查是否有符文。
先转换成符文切片,切片,再转换回来:
string([]rune(str)[:20])
您可以在不分配额外内存的情况下获取 UTF-8 字符串的子字符串(您不必将其转换为 rune
切片):
func substring(s string, start int, end int) string {
start_str_idx := 0
i := 0
for j := range s {
if i == start {
start_str_idx = j
}
if i == end {
return s[start_str_idx:j]
}
i++
}
return s[start_str_idx:]
}
func main() {
s := "世界 Hello"
fmt.Println(substring(s, 0, 1)) // 世
fmt.Println(substring(s, 1, 5)) // 界 He
fmt.Println(substring(s, 3, 8)) // Hello
}
这是一个基于符文技巧的 length-based 实现:
func substr(input string, start int, length int) string {
asRunes := []rune(input)
if start >= len(asRunes) {
return ""
}
if start+length > len(asRunes) {
length = len(asRunes) - start
}
return string(asRunes[start : start+length])
}
如果你不介意实验包,你可以使用这个:
package main
import "golang.org/x/exp/utf8string"
func main() {
a := utf8string.NewString("ÄÅàâäåçèéêëìîïü")
s := a.Slice(1, 3)
println(s == "Åà")
}
我找到了这个,https://groups.google.com/forum/#!topic/golang-nuts/YyKlLwuWt3w但据我所知,这些解决方案对我不起作用。
如果使用将字符串视为切片的方法(str[:20]
),它会在字符中间中断,我们得到“ال�”。
编辑:我相信我可以编写一个函数并将其作为 3 的倍数来执行,因为符文是 int32(32 位/(8 位/字节))。我首先要检查是否有符文。
先转换成符文切片,切片,再转换回来:
string([]rune(str)[:20])
您可以在不分配额外内存的情况下获取 UTF-8 字符串的子字符串(您不必将其转换为 rune
切片):
func substring(s string, start int, end int) string {
start_str_idx := 0
i := 0
for j := range s {
if i == start {
start_str_idx = j
}
if i == end {
return s[start_str_idx:j]
}
i++
}
return s[start_str_idx:]
}
func main() {
s := "世界 Hello"
fmt.Println(substring(s, 0, 1)) // 世
fmt.Println(substring(s, 1, 5)) // 界 He
fmt.Println(substring(s, 3, 8)) // Hello
}
这是一个基于符文技巧的 length-based 实现:
func substr(input string, start int, length int) string {
asRunes := []rune(input)
if start >= len(asRunes) {
return ""
}
if start+length > len(asRunes) {
length = len(asRunes) - start
}
return string(asRunes[start : start+length])
}
如果你不介意实验包,你可以使用这个:
package main
import "golang.org/x/exp/utf8string"
func main() {
a := utf8string.NewString("ÄÅàâäåçèéêëìîïü")
s := a.Slice(1, 3)
println(s == "Åà")
}