Maison >développement back-end >Golang >Pourquoi Go Regex \\b Boundary échoue-t-il avec les caractères latins ?
B Limites avec des caractères latins dans Go Regex
Dans le monde des expressions régulières Go, l'option de limite b a une légère bizarrerie lors du traitement avec des caractères latins. Le problème se pose lorsque vous essayez de définir des mots contenant des caractères latins, tels que des voyelles accentuées et des caractères spéciaux.
Considérez l'exemple suivant, où nous voulons faire correspondre le mot « vis » à l'aide de l'option de limite b :
<code class="go">import ( "fmt" "regexp" ) func main() { r, _ := regexp.Compile(`\b(vis)\b`) fmt.Println(r.MatchString("re vis e")) fmt.Println(r.MatchString("revise")) fmt.Println(r.MatchString("révisé")) }</code>
Étonnamment, le résultat attendu consistant à faire correspondre "révisé" comme faux ne se produit pas. Au lieu de cela, cela correspond à la vérité. En effet, b ne fonctionne que sur les limites des mots ASCII.
Pour résoudre ce problème et faire correspondre avec précision les caractères latins, nous pouvons remplacer la limite b par une alternative plus inclusive. Voici un exemple :
<code class="go">import ( "fmt" "regexp" ) func main() { r, _ := regexp.Compile(`(?:\A|\s)(vis)(?:\s|\z)`) fmt.Println(r.MatchString("vis")) fmt.Println(r.MatchString("re vis e")) fmt.Println(r.MatchString("revise")) fmt.Println(r.MatchString("révisé")) }</code>
Avec cette modification, l'expression régulière reconnaît désormais le début et la fin des mots en utilisant une combinaison de début de chaîne (A), de fin de chaîne (z) et d'espaces (s). . Le résultat correspond avec précision à « vis » comme vrai et « révisé » comme faux :
true true false false
Cette technique garantit une correspondance précise des mots, quelle que soit la présence de caractères latins.
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!