148 votes

Expression régulière pour une chaîne contenant un mot mais pas un autre

Je suis en train de mettre en place des objectifs dans Google Analytics et j'aurais besoin d'un peu d'aide en matière de regex.

Disons que j'ai 4 URL

http://www.anydotcom.com/test/search.cfm?metric=blah&selector=size&value=1
http://www.anydotcom.com/test/search.cfm?metric=blah2&selector=style&value=1
http://www.anydotcom.com/test/search.cfm?metric=blah3&selector=size&value=1
http://www.anydotcom.com/test/details.cfm?metric=blah&selector=size&value=1

Je souhaite créer une expression qui identifiera toute URL contenant la chaîne de caractères selector=size mais ne contient PAS details.cfm

Je sais que pour trouver une chaîne qui ne contient PAS une autre chaîne, je peux utiliser cette expression :

(^((?!details.cfm).)*$)

Mais je ne sais pas comment ajouter l'élément selector=size portion.

Toute aide serait grandement appréciée !

197voto

Kobi Points 65357

Ceci devrait suffire :

^(?!.*details\.cfm).*selector=size.*$

^.*selector=size.*$ devrait être suffisamment clair. La première partie, (?!.*details.cfm) est une anticipation négative : avant de faire correspondre la chaîne, il vérifie qu'elle ne contient pas "details.cfm" (avec n'importe quel nombre de caractères avant).

4voto

Tomalak Points 150423
^(?=.*selector=size)(?:(?!details\.cfm).)+$

Si votre moteur regex prend en charge les quantificateurs posessifs (mais je soupçonne Google Analytics de ne pas le faire), alors je suppose que cela fonctionnera mieux pour les grands ensembles d'entrée :

^[^?]*+(?<!details\.cfm).*?selector=size.*$

3voto

Steve Points 21

Pourrait être (syntaxe perl) :

`/^[(^(?!.*details\.cfm).*selector=size.*)|(selector=size.*^(?!.*details\.cfm).*)]$/`

1voto

Arvind Kumar Avinash Points 49501

Il y a un problème avec les expressions rationnelles dans la réponse acceptée. Il s'agit d'une correspond également abcselector=size , selector=sizeabc etc.

Une expression rationnelle correcte peut être ^(?!.*\bdetails\.cfm\b).*\bselector=size\b.*$

Explication de l'expression rationnelle à regex101 :

enter image description here

0voto

roon Points 1

Je cherchais un moyen d'éviter --line-buffered sur une queue dans une situation similaire à celle de l'OP et la solution de Kobi fonctionne très bien pour moi. Dans mon cas, j'ai exclu les lignes contenant "bot" ou "spider" tout en incluant les lignes suivantes ' / ' (pour mon document racine).

Ma commande initiale :

tail -f mylogfile | grep --line-buffered -v 'bot\|spider' | grep ' / '

Elle devient alors (avec -P commutateur perl) :

tail -f mylogfile | grep -P '^(?!.*(bot|spider)).*\s\/\s.*$'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X