Heim >Backend-Entwicklung >Golang >Wie gehe ich mit Nicht-ASCII-Zeichen in den regulären Ausdrucksgrenzen von Go um?
Golang-Grenze für reguläre Ausdrücke und Nicht-ASCII-Zeichen
Gos Grenze für reguläre Ausdrücke (b) ist so konzipiert, dass sie mit der Grenze zwischen ASCII-Zeichen und übereinstimmt Nicht-ASCII-Zeichen. In bestimmten Szenarien verhält es sich jedoch möglicherweise nicht wie erwartet, wenn lateinische Zeichen beteiligt sind.
Das Problem
In Go funktioniert die b-Grenze nur, wenn sie ASCII umgibt Charaktere. Beispielsweise soll der reguläre Ausdruck b(vis)b mit dem Wort „vis“ übereinstimmen. Wenn das Wort „vis“ jedoch lateinische Zeichen wie „révisé“ enthält, erkennt b es nicht als Wortgrenze.
Bedenken Sie den folgenden Go-Code:
<code class="go">package main import ( "fmt" "regexp" ) func main() { r, _ := regexp.Compile(`\b(vis)\b`) fmt.Println(r.MatchString("re vis e")) // Expected true fmt.Println(r.MatchString("revise")) // Expected true fmt.Println(r.MatchString("révisé")) // Expected false }</code>
Running Dieser Code erzeugt:
true true true
Beachten Sie, dass die letzte Zeile fälschlicherweise mit „révisé“ übereinstimmt.
Die Lösung
So bearbeiten Sie Fälle mit nicht- ASCII-Zeichen können Sie Ihr eigenes benutzerdefiniertes Grenzmuster definieren. Ein Ansatz besteht darin, b durch den folgenden regulären Ausdruck zu ersetzen:
(?:\A|\s)(vis)(?:\s|\z)
Dieses Muster bedeutet:
Diese benutzerdefinierte Grenze erreicht effektiv das, was b für ASCII-Zeichen tut, erstreckt sich aber auch auf Nicht-ASCII-Zeichen wie lateinische Zeichen.
Durch die Einbindung dieses benutzerdefinierten Musters in den regulären Ausdruck können Sie das gewünschte Ergebnis erzielen:
<code class="go">package main import ( "fmt" "regexp" ) func main() { r, _ := regexp.Compile(`(?:\A|\s)(vis)(?:\s|\z)`) fmt.Println(r.MatchString("vis")) // Added this case fmt.Println(r.MatchString("re vis e")) fmt.Println(r.MatchString("revise")) fmt.Println(r.MatchString("révisé")) }</code>
Wenn Sie diesen Code jetzt ausführen, erhalten Sie Folgendes:
true true false false
Wie Sie sehen können, wird „révisé“ korrekt als Übereinstimmung ausgeschlossen.
Das obige ist der detaillierte Inhalt vonWie gehe ich mit Nicht-ASCII-Zeichen in den regulären Ausdrucksgrenzen von Go um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!