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!