2012-06-06 19 views
9

Sto cercando di capire un pezzo di codice e ho trovato questa espressione regolare usata nella funzione preg_replace di PHP.cosa significa espressione regolare (? <! -) significa

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

Questo bit ... (?<!-) doesnt compare in nessuno dei miei manuali REG-exp. Qualcuno sa cosa significa questo per favore? (Google non restituisce nulla - non penso che i simboli funzionino in google.)

+6

Si tratta di uno smiley di nemico di Batman ha colpito all'occhio sinistro, ma sorridente comunque ... (ma corrisponderà a nessuno indossa un cappello simile) –

+0

Per riferimento: [Look-Intorno asserzioni] (http: // perldoc .perl.org/perlre.html # Look-Around-Assertions) da perlre, [Positive and Negative Lookbehind] (http://www.regular-expressions.info/lookaround.html#lookbehind) su regular-expressions.info. – outis

risposta

10

Il ?<! all'inizio di un gruppo parentetico è un negative lookbehind. Asserisce che la parola color (rigorosamente, il c nel motore) non era preceduta da un carattere -.

Così, per un esempio più concreto, sarebbe partita color nelle stringhe:

color 
+color 
someTextColor 

Ma fallirà su qualcosa come -color o background-color. Si noti inoltre che il motore non "abbina" tecnicamente a qualsiasi cosa preceda lo c, semplicemente afferma che non è un trattino. Questa può essere un'importante distinzione a seconda del contesto (illustrated on Rubular with a trivial example; si noti che solo corrisponde allo b nell'ultima stringa, non alla lettera precedente).

6

PHP utilizza espressioni regolari perl compatibili (PCRE) per le funzioni preg_ *. Da perldoc perlre:

"(?<!pattern)"
A larghezza zero negativo look-dietro asserzione. Ad esempio
"/(?<!bar)foo/" corrisponde a qualsiasi occorrenza di "pippo" che corrisponde a
non seguito "bar". Funziona solo per look a larghezza fissa-
dietro.

+0

Perché non citi il ​​[PCRE] (http://pcre.org/pcre.txt)? – Gumbo

+0

@ Gumbo - Sarebbe stato meglio. Ho citato il perldoc perché sapevo esattamente dove trovare le informazioni. – jordanm

4

Sto imparando le espressioni regolari utilizzando il modulo re di Python!

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

Corrisponde se la posizione corrente nella stringa non è preceduta da una corrispondenza per .... Questo è chiamato un'affermazione lookbehind negativo. Simile alle asserzioni lookbehind positive, il pattern contenuto deve corrispondere solo a stringhe di lunghezza fissa. I pattern che iniziano con asserzioni di lookbehind negative possono corrispondere all'inizio della stringa in fase di ricerca.

+1

L'espressione regolare di Python non è PCRE come quella di PHP. – jordanm

+0

Comprensibile, ho appena pensato di indicare un'altra libreria di espressioni regolari, sono nuovo alle espressioni regolari, quindi sto cercando di imparare il più possibile sulle espressioni regolari nelle principali lingue, quindi ho pensato di far notare Python. – richardhsu

Problemi correlati