En mi directorio personal tengo una carpeta drupal-6.14 que contiene la plataforma Drupal.expresión regular lookahead negativo
De este directorio utilizo el siguiente comando:
find drupal-6.14 -type f -iname '*' | grep -P 'drupal-6.14/(?!sites(?!/all|/default)).*' | xargs tar -czf drupal-6.14.tar.gz
Lo que este comando hace es gzips la carpeta drupal-6.14, con exclusión de todas las subcarpetas de -6.14 Drupal/sites/excepto los sitios/todos y sitios/predeterminado, que incluye.
Mi pregunta es sobre la expresión regular:
grep -P 'drupal-6.14/(?!sites(?!/all|/default)).*'
La expresión obras para excluir todas las carpetas que desea excluir, pero no entiendo muy bien por qué.
Es una tarea común el uso de expresiones regulares para
Encontrar todas las cadenas, excepto aquellos que No contienen x sub-patrón. O en otras palabras, negando un subpatrón.
I (creo) Entiendo que la estrategia general para resolver estos problemas es el uso de lookaheads negativos, pero nunca he entendido a un nivel satisfactorio cómo funcionan los aspectos positivos y negativos (adelante/atrás).
A lo largo de los años, he leído muchos sitios web sobre ellos. Los manuales de expresiones regulares de PHP y Python, otras páginas como http://www.regular-expressions.info/lookaround.html y demás, pero nunca he realmente tenía una sólida comprensión de ellos.
¿Podría alguien explicar, cómo funciona esto, y tal vez proporcionar algunos ejemplos similares que harían cosas similares?
- Modificar Uno:
En cuanto a la respuesta de Andomar: puede una búsqueda hacia delante doble negación puede expresar más sucintamente como una sola instrucción de búsqueda positiva hacia:
IE es:
'drupal-6.14/(?!sites(?!/all|/default)).*'
equivalente a:
'drupal-6.14/(?=sites(?:/all|/default)).*'
???
- Actualización Dos:
Según @andomar y @alan Moore - no se puede intercambiar lookahead doble negación de búsqueda positiva hacia delante.
Si una búsqueda anticipada negativa anidada ("búsqueda negativa de doble negativo") puede convertirse en un avance positivo, ¿es posible establecer un equivalente en la forma de anticipación positiva? i.e: (a) ¿Cuál sería la forma de anticipación positiva de mi drupal de doble búsqueda negativa? "'drupal-6.14/(?! sites (?!/all |/default)). *'" example? Sería: 'drupal-6.14/(? = Sites/all | predeterminado). * ??? (b) ¿Cuál sería la forma positiva de anticipación de su doble búsqueda negativa "(!? B (?! C))" ejemplo? – themesandmodules
eww. lo siento. primera vez que usamos los comentarios aquí, el formato es horrible. reafirmaré editando la pregunta. – themesandmodules
@willieseabrook: No lo creo, solo parte de la anticipación es doblemente negativa, por lo que no puede reemplazar el todo con uno positivo – Andomar