如何通过正则表达式匹配 3 和 4 字节 UTF-8
How to match by regexp 3 and 4 bytes UTF-8
我只想使用正则表达式在 Go 中查找 3 字节字符。
但它恐慌
regexp: Compile(\x{E29AA4}
): error parsing regexp: invalid escape
sequence: \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авthree!"
fmt.Println(get_words_from(text))
}
你可以试试playground
使用例如解码 UTF-8 字节序列 E2 9A A4
utf8.DecodeRune()
并在正则表达式中使用生成的符文:
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 到 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 包)转义。
所有示例 return(尝试 Go Playground 上的示例):
[⚤ ⚤]
要过滤掉所有在 UTF-8 中有 3 个或更多字节的符文,您可以使用 for range
和 utf8.RuneLen()
:
text := "One,ВАПОЛтлдо⚤two ыаплд⚤ы ыапю.ы./\tавthree!"
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 ыаплд⚤ы ыапю.ы./ авthree!
One,ВАПОЛтлдоtwo ыаплды ыапю.ы./ авthree!
或使用 strings.Map()
,其中您 return -1
此类符文将在结果中被忽略:
out := strings.Map(func(r rune) rune {
if utf8.RuneLen(r) < 3 {
return r
}
return -1
}, text)
fmt.Println(string(out))
这输出相同。在 Go Playground.
上试试这个
我还发现正则表达式中的字符⚤可以通过\xE2\x9A\xA4匹配而不是错误的:\x{E29AA4}
我只想使用正则表达式在 Go 中查找 3 字节字符。 但它恐慌
regexp: Compile(
\x{E29AA4}
): error parsing regexp: invalid escape sequence:\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авthree!"
fmt.Println(get_words_from(text))
}
你可以试试playground
使用例如解码 UTF-8 字节序列 E2 9A A4
utf8.DecodeRune()
并在正则表达式中使用生成的符文:
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 到 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 包)转义。
所有示例 return(尝试 Go Playground 上的示例):
[⚤ ⚤]
要过滤掉所有在 UTF-8 中有 3 个或更多字节的符文,您可以使用 for range
和 utf8.RuneLen()
:
text := "One,ВАПОЛтлдо⚤two ыаплд⚤ы ыапю.ы./\tавthree!"
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 ыаплд⚤ы ыапю.ы./ авthree!
One,ВАПОЛтлдоtwo ыаплды ыапю.ы./ авthree!
或使用 strings.Map()
,其中您 return -1
此类符文将在结果中被忽略:
out := strings.Map(func(r rune) rune {
if utf8.RuneLen(r) < 3 {
return r
}
return -1
}, text)
fmt.Println(string(out))
这输出相同。在 Go Playground.
上试试这个我还发现正则表达式中的字符⚤可以通过\xE2\x9A\xA4匹配而不是错误的:\x{E29AA4}