solo regulares regular probar online numeros letras expresiones expresion example especiales espacios espacio ejemplos caracteres blanco alfanumerico regex

regulares - javascript regex example



¿Qué caracteres especiales deben ser escapados en expresiones regulares? (8)

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

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


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 con PCRE puede variar

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

Sabores RegEx heredados (BRE / ERE)

Incluye awk, ed, egrep, emacs, GNUlib, grep, PHP (ereg), MySQL, Oracle, R, sed.
El soporte de PCRE se puede habilitar en versiones posteriores o mediante el uso de 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 personaje:. . ^ $ * [ /
Dentro de una clase de personaje: ^ - [ ]
Para los literales, no escapar: + ? ( ) { } | + ? ( ) { } |
Para el comportamiento de expresiones regulares estándar, escape: /+ /? /( /) /{ /} /| /+ /? /( /) /{ /} /|

Notas

  • Si no está seguro acerca de un personaje específico, puede escaparse como /xFF
  • Los caracteres alfanuméricos no se pueden escapar con una barra invertida
  • Los símbolos arbitrarios pueden escaparse con una barra invertida en PCRE, pero no con BRE / ERE (solo deben escaparse cuando sea necesario). Para PCRE ] - solo necesito escapar dentro de una clase de personaje, pero los guardé en una sola lista para simplificar
  • Las cadenas de expresión entre comillas también deben tener los caracteres de comillas circundantes escapados y, a menudo, con barras invertidas duplicadas (como "(/")(/)(//.)" /(")(//)(/.)/ en JavaScript)
  • Aparte de los escapes, diferentes implementaciones de expresiones regulares pueden admitir diferentes modificadores, clases de caracteres, anclas, cuantificadores y otras características. Para obtener más detalles, visite regex101.com o use regex101.com para probar sus expresiones en vivo

A veces no es posible escapar con los personajes que has enumerado. Por ejemplo, usar una barra invertida para escapar de un corchete no va a funcionar en el lado izquierdo de una cadena de sustitución en sed, a saber

sed -e ''s/foo/(bar/something_else/''

Tiendo a usar solo una simple definición de clase de caracteres, por lo que la expresión anterior se convierte en

sed -e ''s/foo[(]bar/something_else/''

que me parece funciona para la mayoría de las implementaciones de expresiones regulares.

Por cierto, las clases de caracteres son componentes de expresión regular bastante vainilla, por lo que tienden a funcionar en la mayoría de las situaciones en las que necesitas caracteres escapados en expresiones regulares.

Edición: después del comentario a continuación, solo pensé en mencionar el hecho de que también debe considerar la diferencia entre los autómatas de estado finito y los autómatas de estado no finito al observar el comportamiento de la evaluación de expresiones regulares.

Es posible que desee consultar "the bright ball book", también conocido como Effective Perl ( enlace de Amazon desinfectado ), específicamente el capítulo sobre expresiones regulares, para tener una idea de la diferencia en los tipos de evaluación de motores de expresiones regulares.

¡No todo el mundo es PCRE!

De todos modos, las expresiones regulares son tan torpes comparadas con SNOBOL ! ¡Ese fue un curso de programación interesante! Junto con el de Simula .

¡Ah, las alegrías de estudiar en UNSW a finales de los 70! (-:


Desafortunadamente, el significado de cosas como (y / (se intercambian entre las expresiones regulares de estilo Emacs y la mayoría de los otros estilos). Así que si intentas escapar de ellas, puedes estar haciendo lo contrario de lo que quieres.

Así que realmente tienes que saber qué estilo estás tratando de citar.



Los caracteres que debe y de los que no debe escapar dependen del sabor de expresión regular con el que está trabajando.

Para PCRE, y la mayoría de los otros sabores compatibles con Perl, evite estas clases de caracteres externos:

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

y estas dentro de las clases de personajes:

^-]/

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

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

Escapar de cualquier otro personaje 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 "ubicación inteligente" si desea incluir metacaracteres de clase de caracteres como literales. Coloque ^ en cualquier lugar excepto al comienzo,] al comienzo, y - al principio o al final de la clase de caracteres para que coincidan con estos literalmente, por ejemplo:

[]^-]

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

.^$*

Escapar de paréntesis y llaves en BRE les da el significado especial que tienen sus versiones sin escaparse en ERE. Algunas implementaciones (por ejemplo, GNU) también le dan un significado especial a otros caracteres cuando se escapan, como /? y +. Escapar de un carácter que no sea. ^ $ * () {} Normalmente es un error con BRE.

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

Si todo esto hace girar tu cabeza, toma 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.


POSIX reconoce múltiples variaciones en las expresiones regulares: expresiones regulares básicas (BRE) y expresiones regulares extendidas (ERE). E incluso entonces, hay peculiaridades debido a las implementaciones históricas de las utilidades estandarizadas por POSIX.

No hay una regla simple para cuándo usar qué notación, o incluso qué notación usa un comando dado.

Echa un vistazo al libro Mastering Regular Expressions de Jeff Friedl.


Para PHP, "siempre es seguro preceder a un no alfanumérico con" / "para especificar que significa". - http://php.net/manual/en/regexp.reference.escape.php .

Excepto si es un "o ''.: /

Para escapar de las variables del patrón de expresiones regulares (o variables parciales) en PHP use preg_quote ()


Realmente, no hay. hay alrededor de un medio trillón de diferentes sintaxis de expresiones regulares; parece que se reducen a Perl, EMACS / GNU y AT&T en general, pero siempre me sorprendo también.