Maison > développement back-end > Golang > Comment gérer les caractères non-ASCII dans les limites des expressions régulières de Go ?

Comment gérer les caractères non-ASCII dans les limites des expressions régulières de Go ?

Susan Sarandon
Libérer: 2024-10-30 02:24:02
original
1040 Les gens l'ont consulté

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

Limite de l'expression régulière Golang et caractères non ASCII

La limite de l'expression régulière de Go (b) est conçue pour correspondre à la limite entre les caractères ASCII et caractères non-ASCII. Cependant, dans certains scénarios, il peut ne pas se comporter comme prévu lorsque des caractères latins sont impliqués.

Le problème

En Go, la limite b ne fonctionne que lorsqu'elle entoure l'ASCII. personnages. Par exemple, l'expression régulière b(vis)b est destinée à correspondre au mot « vis ». Cependant, lorsque le mot « vis » contient des caractères latins, tels que « révisé », b ne parvient pas à le reconnaître comme limite de mot.

Considérez le code Go suivant :

<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>
Copier après la connexion

Exécution ce code produit :

true
true
true
Copier après la connexion

Remarquez que la dernière ligne ne correspond pas correctement à "révisé".

La solution

Pour gérer les cas avec des non- Caractères ASCII, vous pouvez définir votre propre modèle de limite personnalisé. Une approche consiste à remplacer b par l'expression régulière suivante :

(?:\A|\s)(vis)(?:\s|\z)
Copier après la connexion

Ce modèle signifie :

  • (?:A|s) : correspond au début de la chaîne ou à un espace caractère.
  • (vis) : capture le mot « vis ».
  • (?:s|z) : correspond à un caractère d'espacement ou à la fin de la chaîne.

Cette limite personnalisée réalise efficacement ce que b fait pour les caractères ASCII, mais elle s'étend également aux caractères non-ASCII comme les caractères latins.

En incorporant ce modèle personnalisé dans l'expression régulière, vous pouvez obtenir le résultat souhaité :

<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>
Copier après la connexion

L'exécution de ce code donne maintenant :

true
true
false
false
Copier après la connexion

Comme vous pouvez le voir, "révisé" est correctement exclu en tant que correspondance.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal