2009-03-25 24 views
9

que tienen la siguiente expresión regular para espacios eliminando, tabulaciones y nuevas líneas: [^ \n\t]utilizar caracteres de escape dentro grep

Sin embargo, quiero ampliar esto para ciertos caracteres adicionales, como > y <.

me trataron [^ \n\t<>], que funciona bien por ahora, pero quiero que la expresión no coincide si el < o > está precedido por un \.

Intenté [^ \n\t[^\\]<[^\\]>], pero esto no funcionó.

+0

No puede anidar clases de caracteres [...] así. – smci

Respuesta

4

¿Puede alguna de las siguientes secuencias aparecer en su entrada?

\\>
\\\>
\\\\>
\blank
\tab
\newline
...

Si es así, ¿cómo propone tratarlos?

Si no, entonces zero-width look-behind assertions hará el truco, siempre que su motor de expresiones regulares lo admita. Este será el caso en cualquier motor que soporta expresiones regulares al estilo Perl (incluyendo Perl, PHP, etc.):

(?<!\\)[ \n\t<>] 

Lo anterior coincidirá con cualquier espacio, salto de línea, tabuladores ONU escapado o apoyos en ángulo. Más genéricamente (usando \s para denotar cualquier carácter de espacio, incluyendo \r):

(?<!\\)\s 

Alternativamente, usando la notación complementaria sin la necesidad de un vistazo-detrás de la afirmación de anchura cero (pero posiblemente con menos eficiencia):

(?:[^ \n\t<>]|\\[<>]) 

también puede utilizar una variación de este último para manejar las \\>, \\\>, \\\\> etc. casos también hasta un cierto número finito de barras invertidas anteriores, tales como:

(?:[^ \n\t<>]|(?:^|[^<>])[\\]{1,3,5,7,9}[<>]) 
-1

Quizás pueda usar egrep y poner su secuencia de patrones entre comillas. Esto debería eliminar la necesidad de escapar.

0

Según the grep man page:

una expresión entre corchetes es una lista de caracteres encerrados por [y].Es coincide con cualquier carácter único en esa lista ; si el primer carácter de la lista es la referencia ^, entonces coincide con cualquier carácter que no esté en la lista.

Esto significa que no puede hacer coincidir una secuencia de caracteres como \ < o \> solo caracteres individuales.

A menos que tenga una versión de grep construida con soporte Perl regex, entonces puede usar lookarounds como uno de los otros carteles mencionados. Sin embargo, no todas las versiones de grep tienen este soporte.

Cuestiones relacionadas