Heim >Backend-Entwicklung >Golang >Warum schlägt Gos Regex \\b Boundary mit Nicht-ASCII-Zeichen fehl?
Golang Regex-Grenzproblem mit Nicht-ASCII-Zeichen
In Go wird erwartet, dass die b-Grenzoption an der Grenze von ASCII-Zeichen übereinstimmt , ausgenommen Akzentzeichen wie é. Dieses Verhalten kann zu unerwarteten Ergebnissen führen, wenn mit Zeichenfolgen gearbeitet wird, die Nicht-ASCII-Zeichen enthalten. Betrachten Sie beispielsweise den folgenden Code:
<code class="go">package main import ( "fmt" "regexp" ) func main() { r, _ := regexp.Compile(`\b(vis)\b`) fmt.Println(r.MatchString("re vis e")) // True fmt.Println(r.MatchString("revise")) // False fmt.Println(r.MatchString("révisé")) // True }</code>
In diesem Beispiel stimmt der reguläre Ausdruck b(vis)b mit der Teilzeichenfolge „vis“ an Wortgrenzen überein. Bei Anwendung auf „révisé“ wird jedoch fälschlicherweise „True“ zurückgegeben, da é nicht als Wortzeichen betrachtet wird. Um dieses Problem zu lösen, können Sie einen alternativen Ansatz verwenden:
<code class="go">r, _ := regexp.Compile(`(?:\A|\s)(vis)(?:\s|\z)`) fmt.Println(r.MatchString("vis")) // True fmt.Println(r.MatchString("re vis e")) // True fmt.Println(r.MatchString("revise")) // False fmt.Println(r.MatchString("révisé")) // False</code>
Diese Lösung verwendet eine nicht erfassende Gruppe (?:A|s)(vis)(?:s|z), um eine Übereinstimmung mit einer dieser Gruppen zu erzielen die folgenden Zeichen:
Dies ahmt das Verhalten von b nach, umfasst jedoch Nicht-ASCII-Zeichen als mögliche Wortgrenzen. Durch die Kombination dieser Komponenten wird „vis“ am Anfang oder Ende eines Worts erfolgreich gefunden, unabhängig von den umgebenden Zeichen.
Das obige ist der detaillierte Inhalt vonWarum schlägt Gos Regex \\b Boundary mit Nicht-ASCII-Zeichen fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!