Регулярное выражение Голанга с нелатинскими символами

Мне нужны советы от опытных сусликов.

Я разбираю слова из некоторых предложений, а мой \w+ regexp отлично работает с латинскими символами. Однако он полностью терпит неудачу с некоторыми кириллическими символами.

Вот пример приложения:

package main

import (
    "fmt"
    "regexp"
)

func get_words_from(text string) []string {
    words := regexp.MustCompile("\\w+")
    return words.FindAllString(text, -1)
}

func main() {
    text := "One, two three!"
    text2 := "Раз, два три!"
    text3 := "Jedna, dva tři čtyři pět!"
    fmt.Println(get_words_from(text))
    fmt.Println(get_words_from(text2))
    fmt.Println(get_words_from(text3))
}

Это дает следующие результаты:

 [One two three]
 []
 [Jedna dva t i ty i p t]

Он возвращает пустые значения для русского языка и дополнительные слоги для чешского языка. Я не знаю, как решить эту проблему. Может ли кто-нибудь дать мне совет?

Или, может быть, есть лучший способ разбить предложение на слова без знаков препинания?

Ответ 1

Сокращенный класс \w соответствует только символам ASCII в GO regex, поэтому вам понадобится класс символов Unicode \p{L}.

\w символы слова (== [0-9A-Za-z_])

Используйте класс символов для включения цифр и подчеркивания:

    regexp.MustCompile("[\\p{L}\\d_]+")

Вывод демонстрации:

[One two three]
[Раз два три]
[Jedna dva tři čtyři pět]