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
Libérer: 2024-12-24 14:12:15
original
245 Les gens l'ont consulté

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
    }
}
Copier après la connexion

  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!

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