2016-12-06 6 views
3

i-Code haben wie dieseregexp finden für chinesische Unicode-Zeichen

re, err = regexp.Compile(`\p{Han}*`) 
if err != nil { 
    fmt.Println(err) 
    return 
} 
s := "foo中文哦woqu" 
fmt.Println(re.FindString(s)) 

aber es leer drucken.

und dann ändere ich \p{Han}* zu \p{Han}+, es zeigt 中文 哦.

Änderung \p{Han}* zu \p{Han}?, es leer drucken.

Ich finde das Dokument wie folgt aus:

  • x * Null oder mehr x, bevorzugen mehr
  • x + ein oder mehrere x, bevorzugen mehr
  • x? null oder eins x, bevorzugen eine

so erwarte ich, dass mein Druck ist:

  • \p{Han}* drucken 中文 哦
  • \p{Han}+ drucken 中文 哦
  • \p{Han}? Druck 中

konnte jemand erzählt mir was passiert ist?

+0

Wenn Sie das Zeichen finden wollen, verwenden Sie einfach '{Han}' ohne etwas – KoKo

+0

re, err = regexp.Compile (\ {{Han} \ ') gefällt das? es druckt auch leer. – sydnash

+0

wie diese 'regexp.Compile (\' \ p {Han} \ ')' – KoKo

Antwort

3

Als docs sagen (Hervorhebung hinzugefügt):

Findstring einen String zurückgibt den Text des am weitesten links stehenden Spiel in s des regulären Ausdrucks. Wenn keine Übereinstimmung vorhanden ist, ist der Rückgabewert eine leere Zeichenfolge , aber es wird auch leer sein, wenn der reguläre Ausdruck erfolgreich mit einer leeren Zeichenfolge übereinstimmt. Verwenden Sie FindStringIndex oder FindStringSubmatch, wenn Sie diese Fälle unterscheiden müssen.

\p{Han}* entspricht einer leeren Zeichenfolge. Sie können sehen, dass auch durch FindAllString mit:

fmt.Printf("%q", re.FindAllString(s, -1)) 
// Prints ["" "" "" "中文哦" "" "" "" ""] 

Sie \p{Han}+ verwenden können, die nicht eine leere Zeichenkette übereinstimmt.

+0

Ich glaube ich verstehe, was passiert ist: weil * und? passen Sie auch leere Zeichenfolge, so finden Sie Methode print zuerst übereinstimmende Zeichenfolge, die leer ist, danke für die Antwort. – sydnash