Heim  >  Artikel  >  Backend-Entwicklung  >  Warum schlägt Gos Regex \\b Boundary mit Nicht-ASCII-Zeichen fehl?

Warum schlägt Gos Regex \\b Boundary mit Nicht-ASCII-Zeichen fehl?

DDD
DDDOriginal
2024-10-29 00:26:02741Durchsuche

Why Does Go's Regex \b Boundary Fail with Non-ASCII Characters?

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:

  • Anfang der Zeichenfolge (A)
  • Leerzeichen (s)

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn