Регулярное выражение Голанга с нелатинскими символами
Мне нужны советы от опытных сусликов.
Я разбираю слова из некоторых предложений, а мой \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]