2012-06-06 12 views
9

Ich versuche ein Stück Code zu verstehen und stieß auf diesen regulären Ausdruck, der in der PHP-Funktion preg_replace verwendet wird.Was bedeutet der reguläre Ausdruck (? <! -)

'/(?<!-)color[^{:]*:[^{#]*$/i' 

Dieses Bit ... (?<!-) doesnt erscheinen in keinem meiner reg-exp-Handbüchern. Wer weiß was das bedeutet bitte? (Google gibt nichts zurück - ich glaube nicht, dass Symbole in Google funktionieren.)

+6

Es ist ein Smiley von Batmans Feind im linken Auge getroffen, aber lächelnd sowieso ... (aber es wird jemand Match einen ähnlichen Hut) –

+0

Als Referenz: [Look-Around Assertions] (http: // Perldoc .perl.org/perlre.html # Look-Around-Behauptungen) von perlre, [Positive und Negative Lookbehind] (http://www.regular-expressions.info/lookaround.html#lookbehind) auf regular-expressions.info. – outis

Antwort

10

Die am Anfang einer Klammergruppe ist ein negative lookbehind. Es behauptet, dass das Wort color (streng genommen, c in der Maschine) wurde nicht durch eine Zeichen vorangestellt.

Also, für ein konkretes Beispiel wäre es color in den Saiten entsprechen:

color 
+color 
someTextColor 

Aber es wird wie -color oder background-color auf etwas misslingt. Beachten Sie auch, dass die Engine nicht technisch "übereinstimmt", was vor der c vorausgeht, es behauptet einfach, dass es kein Bindestrich ist. Dies kann je nach Kontext eine wichtige Unterscheidung sein (illustrated on Rubular with a trivial example; beachten Sie, dass nur die b in der letzten Zeichenfolge übereinstimmt, nicht den vorhergehenden Buchstaben).

6

PHP verwendet perlkompatible reguläre Ausdrücke (PCRE) für die Funktionen preg_ *. Von perldoc perlre:

"(?<!pattern)"
Eine Null-Breite negative Blick hinter Behauptung. Zum Beispiel
"/(?<!bar)foo/" entspricht jedem Vorkommen von "foo", das
nicht folgt "bar". Funktioniert nur für feste Breite Look-
hinter.

+0

Warum zitieren Sie nicht die [PCRE] (http://pcre.org/pcre.txt)? – Gumbo

+0

@Gumbo - Das wäre besser gewesen. Ich habe das perldoc zitiert, weil ich genau wusste, wo ich die Informationen finden konnte. – jordanm

4

Ich lerne reguläre Ausdrücke mit Pythons re-Modul!

http://docs.python.org/library/re.html

Spiele, wenn die aktuelle Position in der Kette wird durch ein Spiel für nicht voraus .... Dies eine negative Lookbehind Behauptung genannt wird. Ähnlich wie positive Lookbehind-Assertions muss das enthaltene Muster nur Strings bestimmter fester Länge entsprechen. Muster, die mit negativen Lookbehind-Assertionen beginnen, können am Anfang der gesuchten Zeichenfolge übereinstimmen.

+1

Python Regex ist nicht PCRE wie PHP. – jordanm

+0

Verständlich, ich dachte nur, ich würde auf eine andere Bibliothek für reguläre Ausdrücke hinweisen, ich bin neu in regulären Ausdrücken, also versuche ich so viel wie möglich über reguläre Ausdrücke in den meisten Hauptsprachen zu lernen, also wollte ich darauf hinweisen Pythons. – richardhsu