Maison > développement back-end > Golang > Comment puis-je effectuer efficacement une correspondance négative dans les expressions régulières Go sans recherche ?

Comment puis-je effectuer efficacement une correspondance négative dans les expressions régulières Go sans recherche ?

Mary-Kate Olsen
Libérer: 2024-12-20 12:39:09
original
470 Les gens l'ont consulté

How Can I Effectively Perform Negative Matching in Go Regular Expressions Without Lookarounds?

Correspondance négative dans Go Regex

Dans Go regexp, faire correspondre tout sauf une chaîne constante spécifique peut être difficile en raison du manque de constructions de recherche .

RegExp original :

Le régulier fourni expression, /.*/.*/(.*), correspond à tout après trois barres obliques inverses. Cependant, il n'exclut pas les chaînes contenant "somestring".

Approches de négation

Méthode 1 : Service Web

Une La solution de contournement consiste à utiliser un service Web qui génère des modèles annulés compatibles POSIX. Pour "somestring", cela génère un modèle complexe qui peut être remplacé dans la RegExp originale :

/[^/]*/[^/]*/^([^s]|s(s|o(s|m(s|es(omes)*(s|t(s|r(s|i(s|ns)))|o(s|ms)))))*([^os]|o([^ms]|m([^es]|e([^s]|s(omes)*([^ost]|t([^rs]|r([^is]|i([^ns]|n[^gs])))|o([^ms]|m([^es]|e[^s]))))))))*(s(s|o(s|m(s|es(omes)*(s|t(s|r(s|i(s|ns)))|o(s|ms)))))*(o((me?)?|mes(omes)*(t(r?|rin?)|o(me?)?)?))?)?$
Copier après la connexion

Méthode 2 : Classe de caractères

Au lieu d'utiliser .* , l'expression suivante utilise une classe de caractères niée [^/] :

`[^/]+/[^/]+/(.*)`
Copier après la connexion

Cela correspond à tout ce qui va jusqu'à la troisième barre oblique inverse, mais il n'exclut pas les chaînes avec "somestring".

Solution de contournement utilisant les groupes de capture

Étant donné que RE2 (que Go utilise) ne prend pas en charge les analyses anticipées, nous pouvons capturer les trois parties de la chaîne et vérifiez la valeur extraite du groupe de capture :

import (
    "fmt"
    "regexp"
)

func main() {
    s := "anything/anything/somestring"
    r := regexp.MustCompile(`^[^/]+/[^/]+/(.*)`)
    val := r.FindStringSubmatch(s)
    if len(val) > 1 && val[1] != "somestring" {
        fmt.Println(val[1])
    } else {
        fmt.Println("No match")
    }
}
Copier après la connexion

Cette approche capture les valeurs correspondantes et les imprime si ce n'est pas le cas correspond à "une chaîne".

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