2009-05-18 20 views
9

Tengo las siguientes líneas:expresión regular para coincidir líneas que no contengan una palabra

Message:Polarion commit Mon May 18 06:59:37 CEST 2009 
Message:Polarion commit Fri May 15 19:39:45 CEST 2009 
Message:424-18: use new variable 
Message:Polarion commit Fri May 15 19:29:10 CEST 2009 
Message:Polarion commit Fri May 15 19:27:23 CEST 2009 
Message:000-00: do something else 
Message:Polarion commit Fri May 15 17:50:30 CEST 2009 
Message:401-103: added application part 
Message:Polarion commit Fri May 15 17:48:46 CEST 2009 
Message:Polarion commit Fri May 15 17:42:04 CEST 2009 

y quiero conseguir todas las líneas que no contengan "Polarión"

¿Cómo puedo hacer esto?

ps: vi: Regex to match against something that is not a specific substring pero no me ayuda

pps: Estoy tratando de hacer esto en TortoiseSVN para seleccionar los mensajes de registro, y creo que hay un problema con la "búsqueda hacia atrás negativo "

+0

Indique el código y ejemplos de archivos de texto sin formato con cuatro espacios, para garantizar el formato correcto. Puede hacer esto seleccionando el texto y presionando ctrl-k. Aclamaciones. – Stephan202

+0

No todos los motores regex soportan un aspecto negativo: es probable que TortoiseSVN no lo haga. –

Respuesta

9

Puede ser más fácil si hace que su expresión regular coincida con lo que está buscando y luego invierta los resultados.

mayoría de las herramientas que utilizan expresiones regulares permiten hacer una reversión de los resultados de búsqueda, en general, llamando la opción 'v' en el V ert (manteniendo el i para el caso- I nsensitive):

por ejemplo,

grep -v <search> 
find /v <search> 

etc.

+0

Hmmm, el primer texto en negrita, la v en invertida aparece bien en la vista previa pero se ve mal aquí ... –

+0

Los asteriscos no están destinados a ser usados ​​dentro de una palabra, pero ... deberían funcionar. Esta no es la primera vez que veo el panel de vista previa dar resultados falsos. –

+0

+1, esto es justo lo que estaba buscando – Claudiu

19

Esta expresion hará el trabajo.

^(?:.(?<!Polarion))*$ 

Se utiliza un aserción hacia atrás negativo de ancho de cero a afirmar que la cadena no contiene "Polarión".

 
    ^    Anchor to start of string 
    (?:    Non-capturing group 
     .    Match any character 
     (?<!Polarion) Zero-width negative lookbehind assertion - text to the 
         left of the current position must not be "Polarion" 
    ) 
    *     Zero or more times 
    $     Anchor to end of string 

La siguiente versión realizará la afirmación solo después de una 'n'; quizás esto sea más rápido, tal vez más lento.

^(?:[^n]*|n(?<!Polarion))*$ 
+1

Interesante respuesta, pero grep -v es mucho más simple. –

+0

Wow me ayudó con otros editores de texto y java :-). Gracias. –

+0

funciona muy bien en el bloc de notas ++ – BurnsBA

0

no pude encontrar ninguna información sobre lo motor de expresiones regulares TortoiseSVN utiliza, pero es posible que preguntar en la mailing list. No todos los motores admiten funciones avanzadas, como la apariencia negativa de ancho cero.

3

he aquí una solución utilizando una búsqueda negativa hacia delante, lo que más ampliamente aceptada que una búsqueda hacia atrás:

^Message:(?!Polarion).*$ 

(También, ya sabemos de dónde pueden aparecer Polarión, no es necesario hacer ninguna de las inútil . virguerías Daniel sugirió)


Explicación de la expresión anterior, en forma de comentario expresiones regulares, es:

(?x)  # Enable comments 
^   # Start of string (start of line in multiline mode) 
Message: # Literal text 
(?!  # Begin negative lookahead 
Polarion # Literal text 
)   # End negative lookahead 
.*   # Greedily match any number of any character 
$   # End of string (end of line in multiline mode) 
0

Esto me ha funcionado y es rápido para ingresar (en un cuadro de diálogo de búsqueda o similar): ^(?!.*not this).*but this

+0

puede mostrar algunos ejemplos de trabajo –

0

Como muestra this answer, el cuadro de búsqueda de TortoiseSVN no está restringido a las expresiones regulares. Específicamente, si se incluye una expresión en !(), se anula y las líneas que no coinciden aparecen en el resultado. El ! niega la expresión adjunta (regular o no).

Para su caso,

!(Polarion) 

debe hacer el truco.

Cuestiones relacionadas