Wie gehe ich mit Nicht-ASCII-Zeichen in den regulären Ausdrucksgrenzen von Go um?

Susan Sarandon
Freigeben: 2024-10-30 02:24:02
Original
937 Leute haben es durchsucht

 How to Handle Non-ASCII Characters in Go's Regular Expression Boundaries?

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>
Nach dem Login kopieren

Running Dieser Code erzeugt:

true
true
true
Nach dem Login kopieren

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)
Nach dem Login kopieren

Dieses Muster bedeutet:

  • (?:A|s): Entspricht dem Anfang der Zeichenfolge oder einem Leerzeichen Zeichen.
  • (vis): Erfasst das Wort „vis“.
  • (?:s|z): Entspricht einem Leerzeichen oder dem Ende der Zeichenfolge.

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>
Nach dem Login kopieren

Wenn Sie diesen Code jetzt ausführen, erhalten Sie Folgendes:

true
true
false
false
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!