2015-05-27 5 views
11

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

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

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

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

+6

попробовать 'regexp.MustCompile (" \\ p {L} + ")' –

ответ

11

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

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

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

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

Выход из demo:

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

Уу, я вижу. Просто привычка использовать \ w, в то время как мне нужно слово. Виноват. Спасибо за вашу помощь! – Keir

+3

Бонус - если вы используете обратные сигналы, вам не нужно дважды бежать: '' 'regexp.MustCompile (' [\ p {L} \ d_] + ')' '' –

+0

Да, я разместил это, когда был не зная об исходных [строковых литералах в Go] (https://golang.org/ref/spec#String_literals). –

Смежные вопросы