webentwicklung-frage-antwort-db.com.de

Regulärer Ausdruck für eine Zeichenfolge, die ein Wort, aber kein anderes enthält

Ich richte in Google Analytics einige Ziele ein und könnte ein wenig Regex-Hilfe gebrauchen.

Nehmen wir an, ich habe 4 URLs

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

Ich möchte einen Ausdruck erstellen, der jede URL identifiziert, die die Zeichenfolge selector = size enthält, aber NICHT details.cfm enthält

Ich weiß, dass ich diesen Ausdruck verwenden kann, um eine Zeichenfolge zu finden, die KEINE andere Zeichenfolge enthält:

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

Ich bin mir jedoch nicht sicher, wie ich den Abschnitt selector = size hinzufügen soll.

Jede Hilfe wäre sehr dankbar!

90
Chris Stahl

Dies sollte es tun:

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

^.*selector=size.*$ sollte klar genug sein. Das erste Bit, (?!.*details.cfm) ist ein negativer Look-Ahead: Bevor der String abgeglichen wird, wird geprüft, ob der String "details.cfm" enthält (mit einer beliebigen Anzahl von Zeichen davor).

126
Kobi

regex könnte sein (Perl-Syntax):

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

Wenn Ihre Regex-Engine posessive Quantifizierer unterstützt (obwohl ich vermute, dass Google Analytics dies nicht tut), ist die Leistung bei großen Eingabesätzen vermutlich besser:

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

Ich suchte nach einer Möglichkeit, um zu vermeiden, dass in einer ähnlichen Situation wie im OP und in der für mich optimalen Lösung von Kobi ein Zeilenpuffer auf einem Schwanz liegt. In meinem Fall ohne Zeilen mit entweder "bot" oder "spider", während '/' (für mein Root-Dokument) eingefügt wird.

Mein ursprünglicher Befehl:

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

Jetzt wird (mit "-P" Perl-Schalter):

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