En una expresión regular, ¿qué caracteres necesitan escapar?

23

En general, ¿qué caracteres en una expresión regular necesitan escapar?

Por ejemplo, lo siguiente no es sintácticamente correcto:

echo '[]' | grep '[]'
grep: Unmatched [ or [^

Esto, sin embargo, es sintácticamente correcto:

echo '[]' | grep '\[]'
[]

¿Existe alguna documentación sobre qué caracteres se deben escapar en una expresión regular y cuáles no?

LanceBaynes
fuente

Respuestas:

12

Esto depende de la aplicación. En su ejemplo [debe citarse como argumento para greppero no echo.

Para el shell (de las especificaciones POSIX ):

Las comillas se utilizan para eliminar el significado especial de ciertos caracteres o palabras al shell. Las comillas se pueden usar para preservar el significado literal de los caracteres especiales en el siguiente párrafo, evitar que las palabras reservadas se reconozcan como tales y evitar la expansión de parámetros y la sustitución de comandos dentro del procesamiento del documento aquí (ver Documento aquí).

La aplicación debe citar los siguientes caracteres si se representan a sí mismos:

|  &  ;  <  >  (  )  $  `  \  "  '  <space>  <tab>  <newline>

y lo siguiente puede necesitar ser citado bajo ciertas circunstancias. Es decir, estos caracteres pueden ser especiales dependiendo de las condiciones descritas en otra parte de este volumen de IEEE Std 1003.1-2001:

*   ?   [   #   ˜   =   %

Los diversos mecanismos de comillas son el carácter de escape, comillas simples y comillas dobles. El documento aquí representa otra forma de cita; ver aquí el documento.

Los programas específicos (que usan expresiones regulares, perl, awk) podrían tener requisitos adicionales para escapar.

Matteo
fuente
8

Cada aplicación tendrá su propio conjunto de caracteres 'especiales'. El problema con el que te encontraste grepno era con el shell. Para los caracteres que se deben citar grep, lea la sección de la página de manual sobre "EXPRESIONES REGULARES".

Para el shell, los caracteres que se deben citar son:

;'"`#$&*?[]<>{}\

y cualquier espacio en blanco.

Dependiendo del shell, es posible que también se deban citar otros caracteres:

!^%

Mire debajo de "SHELL GRAMMAR" en la página de manual del shell.

Arcege
fuente
En algunos shells con expansión de historial ( bashincluida), !todavía se expande entre comillas dobles, solo las comillas simples detendrán su expansión (o desactivarán la opción de shell).
Chris Down
]No debe ser citado, [no siempre. No encontré ninguna referencia {y}
Matteo
8

Existen múltiples tipos de expresiones regulares y el conjunto de caracteres especiales depende del tipo particular. Algunos de ellos se describen a continuación. En todos los casos, los caracteres especiales se escapan por la barra invertida \. Por ejemplo, para que coincida [escribes en su \[lugar. Alternativamente, los caracteres (excepto ^) podrían escaparse encerrándolos entre corchetes uno por uno como[[] .

Los caracteres que son especiales en algunos contextos como ^ especiales al comienzo de una (sub) expresión se pueden escapar en todos los contextos.

Como otros escribieron: en el shell si no encierra la expresión entre comillas simples, tiene que escapar adicionalmente de los caracteres especiales para el shell en la expresión regular que ya escapó. Ejemplo: en lugar de '\['usted puede escribir \\[(alternativamente: "\["o"\\[" ) en shells compatibles con Bourne como bash, pero esta es otra historia.

Expresiones Regulares Básicas (BRE)

  • POSIX: expresiones regulares básicas
  • Comandos: grep,sed
  • Caracteres especiales: .[\
  • Especial en algunos contextos: *^$
  • Escapar de una cadena: "$(printf '%s' "$string" | sed 's/[.[\*^$]/\\&/g')"

Expresiones regulares extendidas (ERE)

  • POSIX: Expresiones regulares extendidas
  • Comandos:, grep -EGNU:, sed -r* BSD:sed -E
  • Caracteres especiales: .[\(
  • Especial en algunos contextos: *^$)+?{|
  • Escapar de una cadena: "$(printf '%s' "$string" | sed 's/[.[\*^$()+?{|]/\\&/g')"
pabouk
fuente
3

grepusa BRE como su método regex. Hay una buena documentación sobre el mismo aquí , un resumen general sería "escapar cualquier carácter o meta-carácter especial para conseguir su literal, escapar para crear secuencias de escape ( \n, \r, etc)", aunque esto no siempre es cierto, por ejemplo, tiene que escapar (y )obtener su significado especial (referencia).

Chris Down
fuente
0

El shell puede transformar la línea de comando antes de la ejecución del comando. Tanto el shell como el grepuso de comillas pueden eliminar el significado especial de algunos caracteres. No obstante, grepy las conchas tienen diferentes caracteres especiales. Además, el shell elimina los caracteres especiales sin escape que no resultaron de una expansión existente, antes de la ejecución del comando.

echo '[]' | grep '[]'

La cáscara transmite el argumento []a grepy se analiza como una expresión soporte con formato incorrecto por grep.

echo '[]' | grep \[]

Arriba, podemos ver un caso similar. La barra invertida se elimina y []se transmite como argumento a grep. grepreconoce una expresión de corchete con formato incorrecto.

echo '[]' | grep '\[]'

Finalmente, en este caso, el shell elimina las comillas y \[]se transmite como argumento greppero, en este caso específico, ¹, \[se interpreta grepcomo un paréntesis literal. Se necesitan comillas para evitar que el intérprete interprete la barra invertida como un carácter especial.


¹ Especificación POSIX .

Fólkvangr
fuente