gpt4 book ai didi

string - 如何通过正则表达式匹配 3 和 4 字节 UTF-8

转载 作者:行者123 更新时间:2023-12-03 10:07:35 24 4
gpt4 key购买 nike

我只想使用正则表达式在 Go 中找到 3 字节字符。
但它 panic

regexp: Compile(\x{E29AA4}): error parsing regexp: invalid escapesequence: \x{E29AA4

func get_words_from(text string) []string {
words := regexp.MustCompile(`\x{E29AA4}`)
return words.FindAllString(text, -1)
}

func main() {
text := "One,ВАПОЛтлдо⚤two ыаплд⚤ы ыапю.ы./\tавt𒀅hr𓀋ee!"
fmt.Println(get_words_from(text))
}
您可以试穿 playground

最佳答案

解码 UTF-8 字节序列 E2 9A A4与例如 utf8.DecodeRune() 并在正则表达式中使用生成的 rune :

func get_words_from(text string) []string {
r, _ := utf8.DecodeRune([]byte{0xE2, 0x9A, 0xA4})
words := regexp.MustCompile(string(r))
return words.FindAllString(text, -1)
}
您也可以简单地 convert字节 slice 到 string (将其解释为 UTF-8 编码字节):
func get_words_from2(text string) []string {
s := string([]byte{0xE2, 0x9A, 0xA4})
words := regexp.MustCompile(s)
return words.FindAllString(text, -1)
}
或者在正则表达式字符串中使用等效的 unicode 代码点(即 0x26a4):
func get_words_from3(text string) []string {
words := regexp.MustCompile("\u26a4")
return words.FindAllString(text, -1)
}
请注意 "\u26a4"是解释的 string文字并且不会被 Go 编译器(不是 regexp 包)转义。
所有示例都返回(尝试 Go Playground 上的示例):
[⚤ ⚤]
要过滤掉所有在 UTF-8 中具有 3 个或更多字节的 rune ,您可以使用 for range utf8.RuneLen() :
text := "One,ВАПОЛтлдо⚤two ыаплд⚤ы ыапю.ы./\tавt𒀅hr𓀋ee!"
fmt.Println(text)

var out []rune
for _, r := range text {
if utf8.RuneLen(r) < 3 {
out = append(out, r)
}
}
fmt.Println(string(out))
这个输出(在 Go Playground 上试试):
One,ВАПОЛтлдо⚤two ыаплд⚤ы ыапю.ы./  авt𒀅hr𓀋ee!
One,ВАПОЛтлдоtwo ыаплды ыапю.ы./ авthree!
或使用 strings.Map() , 你返回的地方 -1对于这样的 rune ,结果将被排除在外:
out := strings.Map(func(r rune) rune {
if utf8.RuneLen(r) < 3 {
return r
}
return -1
}, text)
fmt.Println(string(out))
这输出相同。在 Go Playground 上试试这个.

关于string - 如何通过正则表达式匹配 3 和 4 字节 UTF-8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65273674/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com