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>
Exécution ce code produit :
true true true
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)
Ce modèle signifie :
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>
L'exécution de ce code donne maintenant :
true true false false
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!