2015-05-27 4 views
11

मुझे कुशल गोफर से कुछ सलाह चाहिए।गैर-लैटिन वर्णों के साथ गोलांग रेगेक्सपी

मैं कुछ वाक्यों से शब्दों को पार्स कर रहा हूं और मेरे \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 {एल} + ")' –

उत्तर

11

\w आशुलिपि वर्ग केवल इस प्रकार, आप एक यूनिकोड वर्ण वर्ग \p{L} जरूरत GO regex में ASCII अक्षरों से मेल खाता है,।

\w शब्द वर्ण (== [0-9A-Za-z_])

एक चरित्र वर्ग का उपयोग अंक शामिल हैं और करने के लिए रेखांकित: demo की

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

आउटपुट:

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

ओउ, मैं देखता हूं। मुझे शब्द की आवश्यकता होने पर बस एक डब्ल्यू का उपयोग करने की आदत है। मेरी गलती। आपकी सहायताके लिए धन्यवाद! – Keir

+3

बोनस - यदि आप बैकटिक्स का उपयोग करते हैं, तो आपको डबल-एस्केप नहीं करना होगा: '' regexp.MustCompile ('[\ p {L} \ d _] +') '' –

+0

हां, मैंने इसे पोस्ट किया था जब मैं था कच्चे [स्ट्रिंग अक्षर में जाओ] (https://golang.org/ref/spec#String_literals) से अवगत नहीं है। –

संबंधित मुद्दे