Nella mia directory home ho una cartella drupal-6.14 che contiene la piattaforma Drupal.Espressione normale lookahead negativo
Da questa directory Io uso il seguente comando:
find drupal-6.14 -type f -iname '*' | grep -P 'drupal-6.14/(?!sites(?!/all|/default)).*' | xargs tar -czf drupal-6.14.tar.gz
Che questo comando non fa altro che gzip la cartella drupal-6.14, escludendo tutte le sottocartelle della Drupal 6.14/siti/tranne siti/tutti e siti/default, che include.
La mia domanda è l'espressione regolare:
grep -P 'drupal-6.14/(?!sites(?!/all|/default)).*'
L'espressione lavora per escludere tutte le cartelle che voglio esclusi, ma io non riesco a capire perché.
Si tratta di un compito comune utilizzando le espressioni regolari per
hanno tutte le stringhe, ad eccezione di quelli che Non contengono sotto-regola x. O in altre parole, annullando un subpattern.
I (credo) ho capito che la strategia generale per risolvere questi problemi è l'uso di lookaheads negative, ma non ho mai capito a un livello soddisfacente di come aspetto positivo e negativo (avanti/indietro) s lavoro.
Nel corso degli anni, ho letto molti siti Web su di essi. I manuali di regex di PHP e Python, altre pagine come http://www.regular-expressions.info/lookaround.html e così via, ma non ho mai avuto il veramente hanno avuto una solida comprensione di loro.
Qualcuno potrebbe spiegare come funziona e forse fornire esempi simili che farebbero cose simili?
- aggiornare uno:
Per quanto riguarda la risposta di Andomar: può una doppia lookahead negativo essere più sinteticamente espresso come una singola istruzione lookahead positivo:
IE è:
'drupal-6.14/(?!sites(?!/all|/default)).*'
equivalente a:
'drupal-6.14/(?=sites(?:/all|/default)).*'
???
- Aggiornamento Due:
Come per @andomar e @alan Moore - non è possibile scambiare doppio lookahead negativo per lookahead positivo.
Se un lookahead negativo annidato ("double lookahead negativo") può diventare un aspetto positivo, è possibile indicare un equivalente in forma lookahead positiva? i.e: (a) Quale sarebbe la forma di lookahead positiva della mia doppia drupal lookahead negativo "'drupal-6.14/(?! sites (?!/all |/default)).' '" esempio? Sarebbe: 'drupal-6.14/(? = Siti/tutti | default). * ??? (b) Quale sarebbe la forma di lookahead positiva del tuo lookahead double negativo "(!? B (?! C))" esempio? – themesandmodules
eww. scusa. la prima volta utilizzando i commenti qui che la formattazione è orribile. mal riformare modificando la domanda. – themesandmodules
@willieseabrook: non pensateci, solo una parte del lookahead è doppiamente negativa, quindi non è possibile sostituire l'intero con uno positivo. – Andomar