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
Mary-Kate Olsenoriginal
2024-12-20 12:39:09590parcourir

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?)?)?))?)?$

Méthode 2 : Classe de caractères

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

`[^/]+/[^/]+/(.*)`

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")
    }
}

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!

Déclaration:
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