如何通过正则表达式匹配 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)
}

您也可以简单地 convertstring 的字节切片(将其解释为 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 rangeutf8.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}