Buscar..


Literales crudos de cuerda

Es mejor para la legibilidad (y su cordura) para evitar escapar de los escapes. Ahí es donde entran en juego los literales de cadenas en bruto. (Tenga en cuenta que algunos idiomas permiten delimitadores, que generalmente se prefieren a las cadenas. Pero esa es otra sección).

Por lo general, funcionan de la misma manera que esta respuesta describe :

[A] barra invertida, \ , se toma como que significa "solo una barra invertida" (excepto cuando aparece justo antes de una cita que de otra manera terminaría el literal) - no hay "secuencias de escape" para representar nuevas líneas, tabulaciones, espacios en blanco, feeds de formularios , y así.

No todos los idiomas los tienen, y los que usan una sintaxis variable. C # en realidad los llama literales de cadena literal , pero es lo mismo.


Pitón

pattern = r"regex"
pattern = r'regex'

C ++ (11+)

La sintaxis aquí es extremadamente versátil. La única regla es usar un delimitador que no aparezca en ninguna parte de la expresión regular. Si lo hace, no es necesario que escape más para nada en la cadena. Tenga en cuenta que los paréntesis () no forman parte de la expresión regular:

pattern = R"delimiter(regex)delimiter";

VB.NET

Solo usa una cuerda normal. Las barras invertidas son siempre literales .

DO#

pattern = @"regex";

Tenga en cuenta que esta sintaxis también permite "" (dos comillas dobles) como una forma de escape de " .

Instrumentos de cuerda

En la mayoría de los lenguajes de programación, para tener una barra invertida en una cadena generada a partir de una cadena literal, cada barra invertida debe duplicarse en la cadena literal. De lo contrario, se interpretará como un escape para el siguiente personaje.

Desafortunadamente, cualquier barra invertida requerida por la expresión regular debe ser una barra invertida literal. Es por esto que se hace necesario tener "escapes de escape" ( \\ ) cuando las expresiones regulares se generan a partir de literales de cadena.

Además, las comillas ( " o ' ) en el literal de cadena pueden ser eliminadas, dependiendo de lo que rodee al literal de cadena. En algunos idiomas, es posible usar cualquiera de los estilos de comillas para una cadena (elija el más legible para escapando de toda la cadena literal).

En algunos idiomas (por ejemplo, Java <= 7), las expresiones regulares no se pueden expresar directamente como literales como /\w/ ; deben generarse a partir de cadenas, y normalmente se utilizan literales de cadena, en este caso, "\\w" . En estos casos, los caracteres literales, como comillas, barras invertidas, etc., deben escaparse. La forma más fácil de lograr esto puede ser usando una herramienta (como RegexPlanet ). Esta herramienta específica está diseñada para Java, pero funcionará para cualquier idioma con una sintaxis de cadena similar.

¿Qué personajes necesitan ser escapados?

El escape de caracteres es lo que permite buscar y encontrar literalmente ciertos caracteres (reservados por el motor de expresiones regulares para manipular búsquedas) en la cadena de entrada. El escape depende del contexto, por lo tanto, este ejemplo no cubre el escape de la cadena o delimitador .

Barras invertidas

Decir que la barra invertida es el carácter de "escape" es un poco confuso. La barra invertida se escapa y la barra invertida trae; en realidad, activa o desactiva el metacarácter frente al estado literal del personaje que se encuentra frente a él.

Para utilizar una barra invertida literal en cualquier parte de una expresión regular, debe ser escapada por otra barra invertida.

Escape (fuera de las clases de personajes)

Hay varios personajes que necesitan ser escapados para ser tomados literalmente (al menos fuera de las clases char):

  • Soportes: []
  • Paréntesis: ()
  • Aparatos ortopédicos: {}
  • Operadores: * , + ? , |
  • Anclajes: ^ , $
  • Otros: . , \
  • Para utilizar un literal ^ al inicio o un $ literal al final de una expresión regular, el carácter debe ser escapado.
  • Algunos sabores solo usan ^ y $ como metacaracteres cuando están al principio o al final de la expresión regular, respectivamente. En esos sabores, ningún escape adicional es necesario. Por lo general, es mejor escapar de todos modos.

Escapar dentro de las clases de personajes

  • Es una buena práctica escapar de los corchetes ( [ y ] ) cuando aparecen como literales en una clase char. Bajo ciertas condiciones, no se requiere, dependiendo del sabor , pero daña la legibilidad.
  • El caret, ^ , es un meta carácter cuando se coloca como primer carácter en una clase char: [^aeiou] . En cualquier otro lugar de la clase char, es solo un carácter literal.
  • El guión, - , es un meta carácter, a menos que esté al principio o al final de una clase de carácter. Si el primer carácter de la clase char es un carácter de carácter ^ , entonces será un literal si es el segundo carácter de la clase char.

Escapar de la sustitución

También hay reglas para escapar dentro del reemplazo, pero ninguna de las reglas anteriores se aplican. Los únicos metacaracteres son $ y \ , al menos cuando $ se puede usar para hacer referencia a grupos de captura (como $1 para el grupo 1). Para usar un $ literal, escápalo: \$5.00 . Del mismo modo \ : C:\\Program Files\\ .


Excepciones BRE

Mientras que ERE (expresiones regulares extendidas) refleja la sintaxis típica de estilo Perl, BRE (expresiones regulares básicas) tiene diferencias significativas cuando se trata de escapar:

  • Hay diferentes sintaxis abreviada. Todos los \d , \s , \w y así sucesivamente se han ido. En su lugar, tiene su propia sintaxis (que POSIX confusamente llama "clases de caracteres"), como [:digit:] . Estas construcciones deben estar dentro de una clase de caracteres.
  • Hay pocos metacaracteres ( . , * , ^ , $ ) Que se pueden usar normalmente. TODOS los otros metacaracteres deben escaparse de manera diferente:

Llaves {}

  • a{1,2} coincide con a{1,2} . Para hacer coincidir a o aa , use a\{1,2\}

Paréntesis ()

  • (ab)\1 no es válido, ya que no hay un grupo de captura 1. Para solucionarlo y hacer coincidir abab use \(ab\)\1

Barra invertida

  • Dentro de las clases de caracteres (que se denominan expresiones de corchete en POSIX), la barra diagonal inversa no es un metacarácter (y no necesita escaparse). [\d] coincide con \ o d .
  • En cualquier otro lugar, escapar como de costumbre.

Otro

  • + y ? son literales. Si el motor BRE los admite como metacaracteres, deben escaparse como \? y \+ .

/ Delimitadores /

Muchos idiomas permiten que las expresiones regulares se incluyan o delimiten entre un par de caracteres específicos, generalmente la barra diagonal hacia adelante / .

Los delimitadores tienen un impacto en el escape: si el delimitador es / y la expresión regular necesita buscar / literales, entonces la barra inclinada debe escaparse antes de que pueda ser un literal ( \/ ).

La fuga excesiva perjudica la legibilidad, por lo que es importante considerar las opciones disponibles:

Javascript es único porque permite la barra inclinada como un delimitador, pero nada más (aunque sí permite expresiones regulares de cadena ).

Perl 1

Perl, por ejemplo, permite que casi cualquier cosa sea un delimitador. Incluso los caracteres árabes:

$str =~ m ش ش

Reglas específicas son mencionadas en la documentación de Perl .

PCRE permite dos tipos de delimitadores: delimitadores emparejados y delimitadores de estilo de corchete. Los delimitadores combinados hacen uso de un par de un solo carácter, mientras que los delimitadores de estilo corchete hacen uso de un par de caracteres que representan un par de apertura y cierre.

  • Delimitadores coincidentes:! !"#$%&'*+,./:;=?@^_`|~-
  • Delimitadores de estilo de corchete: () , {} , [] , <>


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow