2015-05-27 11 views
11

Ho bisogno di un consiglio da esperti gopher.Golang regexp con caratteri non latini

Sto analizzando le parole da alcune frasi e il mio regexp \w+ funziona correttamente con caratteri latini. Tuttavia, fallisce totalmente con alcuni caratteri cirillici.

Ecco un'applicazione di esempio:

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

produce i seguenti risultati:

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

Esso restituisce valori vuoti per il russo, e sillabe in più per il ceco. Non ho idea di come risolvere questo problema. Qualcuno potrebbe darmi un consiglio?

O forse c'è un modo migliore per dividere una frase in parole senza segni di punteggiatura?

+6

prova 'regexp.MustCompile (" \\ p {L} + ")' –

risposta

11

La classe stenografica \w corrisponde solo alle lettere ASCII nello GO regex, pertanto è necessaria una classe di caratteri Unicode \p{L}.

\w caratteri di parola (== [0-9A-Za-z_])

Utilizzare una classe di caratteri per includere le cifre e sottolineano:

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

uscita del demo:

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

Ouu, vedo. Solo l'abitudine di usare \ w, mentre ho bisogno di parole. Colpa mia. Grazie per l'aiuto! Bonus – Keir

+3

- se usi i backtick, non devi fare il double-escape: '' 'regexp.MustCompile (' [\ p {L} \ d _] + ')' '' –

+0

Sì, ho postato questo quando ero non a conoscenza dei raw [string letterals in Go] (https://golang.org/ref/spec#String_literals). –

Problemi correlati