¿Qué caracteres especiales se deben utilizar como escape en las expresiones regulares?

Resuelto Igor Katson asked hace 15 años • 13 respuestas

Estoy cansado de tratar siempre de adivinar si debo escapar de caracteres especiales como ' ()[]{}|' etc. cuando uso muchas implementaciones de expresiones regulares.

Es diferente, por ejemplo, con Python, sed, grep, awk, Perl, rename, Apache, find, etc. ¿Existe algún conjunto de reglas que indique cuándo debo y cuándo no debo escapar de los caracteres especiales? ¿Depende del tipo de expresión regular, como PCRE, POSIX o expresiones regulares extendidas?

Igor Katson avatar Dec 30 '08 06:12 Igor Katson
Aceptado

De qué personajes debes escapar y de cuáles no, depende del tipo de expresión regular con el que estés trabajando.

Para PCRE y la mayoría de las otras versiones denominadas compatibles con Perl, escape estas clases de caracteres externos:

.^$*+?()[{\|

y estas clases de personajes internos:

^-]\

Para expresiones regulares extendidas (ERE) POSIX, escape estas clases de caracteres externos (igual que PCRE):

.^$*+?()[{\|

Escapar de cualquier otro carácter es un error con POSIX ERE.

Dentro de las clases de caracteres, la barra invertida es un carácter literal en las expresiones regulares POSIX. No puedes usarlo para escapar de nada. Debe utilizar una "ubicación inteligente" si desea incluir metacaracteres de clases de caracteres como literales. Coloque ^ en cualquier lugar excepto al inicio, ] al inicio y - al inicio o al final de la clase de caracteres para que coincidan literalmente, por ejemplo:

[]^-]

En las expresiones regulares básicas (BRE) POSIX, estos son metacaracteres de los que debes escapar para suprimir su significado:

.^$*[\

La opción de escape de paréntesis y llaves en BRE les da el significado especial que tienen sus versiones sin escape en ERE. Algunas implementaciones (por ejemplo, GNU) también dan un significado especial a otros caracteres cuando se utilizan escapes, como \? y +. Escapar de un carácter que no sea .^$*(){} normalmente es un error con los BRE.

Dentro de las clases de caracteres, los BRE siguen la misma regla que los ERE.

Si todo esto le da vueltas la cabeza, obtenga una copia de RegexBuddy . En la pestaña Crear, haga clic en Insertar token y luego en Literal. RegexBuddy agregará escapes según sea necesario.

Jan Goyvaerts avatar Dec 30 '2008 14:12 Jan Goyvaerts

Sabores RegEx modernos (PCRE)

Incluye C, C++, Delphi, EditPad, Java, JavaScript, Perl, PHP (preg), PostgreSQL, PowerGREP, PowerShell, Python, REALbasic, Real Studio, Ruby, TCL, VB.Net, VBScript, wxWidgets, XML Schema, Xojo, XRegExp.
La compatibilidad PCRE puede variar

    En cualquier lugar:. ^ $ * + - ? ( ) [ ] { } \ |


Sabores RegEx heredados (BRE/ERE)

Incluye awk, ed, egrep, emacs, GNUlib, grep, PHP (ereg), MySQL, Oracle, R, sed.
La compatibilidad con PCRE puede habilitarse en versiones posteriores o mediante extensiones

ERE/awk/egrep/emacs

    Fuera de una clase de personaje: . ^ $ * + ? ( ) [ { } \ |
    Dentro de una clase de personaje:^ - [ ]

BRE/ed/grep/sed

    Fuera de una clase de carácter: . ^ $ * [ \
    Dentro de una clase de carácter: ^ - [ ]
    Para literales, no escape: + ? ( ) { } |
    Para comportamiento de expresiones regulares estándar, escape:\+ \? \( \) \{ \} \|


Notas

  • Si no está seguro acerca de un personaje específico, se puede escapar como\xFF
  • Los caracteres alfanuméricos no se pueden escapar con una barra invertida
  • Los símbolos arbitrarios pueden tener caracteres de escape con una barra invertida en PCRE, pero no BRE/ERE (solo deben tener caracteres de escape cuando sea necesario). Para PCRE ] -solo es necesario escapar dentro de una clase de personaje, pero los mantuve en una sola lista para simplificar
  • Las cadenas de expresión entre comillas también deben tener los caracteres de comillas circundantes en formato de escape y, a menudo, con barras invertidas duplicadas (como "(\")(/)(\\.)"versus /(")(\/)(\.)/en JavaScript).
  • Aparte de los escapes, diferentes implementaciones de expresiones regulares pueden admitir diferentes modificadores, clases de caracteres, anclajes, cuantificadores y otras características. Para obtener más detalles, consulte regular-expressions.info o utilice regex101.com para probar sus expresiones en vivo.
Beejor avatar Aug 25 '2015 19:08 Beejor

Desafortunadamente, en realidad no existe un conjunto de códigos de escape, ya que varía según el idioma que esté utilizando.

Sin embargo, mantener una página como la Página de herramientas de expresión regular o esta Hoja de trucos de expresión regular puede ser de gran ayuda para filtrar las cosas rápidamente.

Dillie-O avatar Dec 29 '2008 23:12 Dillie-O