Maison >développement back-end >Golang >Comment puis-je utiliser Go Regexp pour faire correspondre tout sauf une chaîne spécifique ?

Comment puis-je utiliser Go Regexp pour faire correspondre tout sauf une chaîne spécifique ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-24 14:12:15253parcourir

How Can I Use Go Regexp to Match Everything Except a Specific String?

Puis-je tout trouver sauf une certaine chaîne à l'aide de Go Regexp ?

Comme de nombreuses questions similaires l'ont montré, faire correspondre une chaîne spécifique à l'aide de Go les expressions régulières peuvent être difficiles. Cette question demande comment faire une comparaison avec une chaîne au format "n'importe quoi/n'importe quoi/une chaîne", mais exclure les chaînes contenant "une chaîne".

Le modèle "/././(. )" correspondrait à "une chaîne", mais nous voulons faire correspondre tout sauf cela. La plupart des solutions proposées utilisent "/././((?!somestring).),", qui n'est pas valide dans l'expression rationnelle Go car elle contient un jeton non quantifiable.

Go ne prend pas en charge les analyses anticipées pour garantir des limites de temps d'exécution linéaire (O(n)). Par conséquent, des solutions de contournement sont nécessaires.

Service Web pour les modèles annulés

Une approche consiste à utiliser le service Web non-match-regex pour générer des modèles annulés compatibles avec POSIX. Pour "somestring", le modèle généré est :

^(

1|s(s|o(s|m(s|es(omes)(s| t(s|r(s|i(s|ns)))|o(s|ms)))))(2|o( 3|m(4|e(1|s(omes)(5|t(6|r(7|i( 8|n9)))|o(3|m(4|e1)))))))(s(s|o(s|m(s|es( o mes)(s|t(s|r(s|i(s|ns)))|o(s|ms)))))(o((moi?)?|mes(omes )*(t(r?|rin?)|o(moi?)?)?))?$

Remplacement le dernier "(.*)" avec "" dans vos rendements regex d'origine :

/10/10/((1 |s(s|o(s|m(s|es(omes)(s|t(s|r(s|i(s|ns)))|o(s|ms)))) )(2|o(3|m(4 |e(1|s(omes)(5|t(6| r(7|i(8|n9)))|o( 3|m(4|e1))))))))( s(s|o (s|m(s|es(omes)(s|t(s|r(s|i(s|ns)))|o(s|ms)))))(o( (moi?)?|mes(omes)*(t(r?|rin?)|o(moi?)?)?))?)?)$

Ceci garantit que l'expression régulière ne capture la pièce qu'après la troisième barre oblique inverse.

Capturer les trois parties

Une solution alternative capture les trois parties qui vous intéressent. Après vérification la valeur du groupe de capture n°1, vous pouvez décider quoi retourner :

package main

import (
    "fmt"
    "regexp"
)

func main() {
    s := "anything/anything/somestring"
    r := regexp.MustCompile(`^[^/]+/[^/]+/(.*)`)
    val := r.FindStringSubmatch(s)
    // fmt.Println(val[1]) // -> somestring
    if len(val) > 1 && val[1] != "somestring" { // val has more than 1 element and is not equal to somestring?
        fmt.Println(val[1])      // Use val[1]
    } else {
        fmt.Println("No match")  // Else, report no match
    }
}

  1. s
  2. os
  3. ms
  4. es
  5. ost
  6. rs
  7. est
  8. ns
  9. gs
  10. /

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