2015-05-27 10 views
11

Potrzebuję porady od wykwalifikowanych świstaków.Reagowanie golang ze znakami innymi niż łacińskie

Parsuję wyrazy z niektórych zdań, a moje wyrażenie regularne działa dobrze w przypadku znaków alfabetu łacińskiego. Jednak całkowicie zawiedzie niektóre znaki cyrylicy.

Tutaj jest app próbki:

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)) 
} 

otrzymuje on następujące wyniki:

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

Zwraca pustych wartości rosyjskim i dodatkowe sylaby do Czech. Nie mam pojęcia, jak rozwiązać ten problem. Czy ktoś może udzielić mi porady?

A może jest lepszy sposób na podzielenie zdania na słowa bez interpunkcji?

+6

spróbować 'regexp.MustCompile (" \\ p {L} + ")' –

Odpowiedz

11

Skrócona klasa \w pasuje tylko do liter ASCII w GO regex, dlatego potrzebna jest klasa znaków Unicode \p{L}.

\w znaki słowne (== [0-9A-Za-z_])

Użyj klasa znaków do zawierać cyfry i podkreślenia:

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

wyjściu demo:

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

Ouu, rozumiem. Nawyk używania \ w, gdy potrzebuję słowa. Mój błąd. Dzięki za pomoc! – Keir

+3

Premia - jeśli używasz wycofań, nie musisz podwójnie uciekać: '' 'regexp.MustCompile (' [\ p {L} \ d _] + ')' '' –

+0

Tak, opublikowałem to, gdy byłem nie zna surowego [literały łańcuchowe w Go] (https://golang.org/ref/spec#String_literals). –

Powiązane problemy