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

Je mets en place des objectives dans Google Analytics et je pourrais utiliser une petite aide pour les regex.

Disons que j’ai 4 URL

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

Je veux créer une expression qui identifiera toute URL contenant le sélecteur de chaîne = size mais ne contient pas de détails.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 append la partie sélecteur = taille .

Toute aide serait grandement appréciée!

Cela devrait le faire:

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

^.*selector=size.*$ devrait être assez clair. Le premier bit, (?!.*details.cfm) est une (?!.*details.cfm) 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).

regex pourrait être (syntaxe perl):

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

Si votre moteur de regex supportait des quantificateurs posessifs (bien que je soupçonne que Google Analytics ne le fait pas), je suppose que cela fonctionnera mieux pour les grands ensembles d’entrées:

 ^[^?]*+(? 

Je cherchais un moyen d’éviter – line-buffered sur une queue dans une situation similaire à celle de la solution OP et Kobi fonctionne très bien pour moi. Dans mon cas, exclure les lignes avec soit “bot” ou “spider” tout en incluant ‘/’ (pour mon document racine).

Ma commande d’origine:

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

Maintenant, devient (avec le commutateur perl “-P”):

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

Un moyen simple de le faire est de spécifier 0 instances de la chaîne en procédant comme suit

 (ssortingng_to_exclude){0}