web-dev-qa-db-fra.com

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

Je suis en train de définir des objectifs dans Google Analytics et je pourrais utiliser un peu d'aide 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 veux créer une expression qui identifiera toute URL contenant la chaîne sélecteur = taille 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 suis pas sûr de savoir comment ajouter la portion sélecteur = taille.

Toute aide serait grandement appréciée!

90
Chris Stahl

Cela devrait le faire:

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

^.*selector=size.*$ devrait être assez clair. Le premier bit, (?!.*details.cfm) est une image négative: avant de faire correspondre la chaîne, elle vérifie que la chaîne ne contient pas "details.cfm" (avec un nombre quelconque de caractères avant celle-ci).

126
Kobi

regex pourrait être (syntaxe Perl):

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

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

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

Je cherchais un moyen d'éviter - une ligne tamponnée sur une queue dans une situation similaire à celle de l'OP et la solution de Kobi me convenait parfaitement. Dans mon cas, exclure les lignes avec "bot" ou "spider" tout en incluant "/" (pour mon document racine).

Ma commande d'origine:

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

Devient maintenant (avec "-P" le commutateur Perl):

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