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 "/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 } }
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!