¿No puede escapar de la barra invertida con expresiones regulares?

114

Estoy usando la siguiente expresión regular

^[a-zA-Z0-9\',!;\?\$\^:\\\/`\|~&\" @#%\*\{}\(\)_\+\.\s=-]{1,1000}$

Sé que es feo, pero hasta ahora cumple su propósito, además de que no se permite la barra invertida como creo que debería porque se escapó, también lo intenté en \\lugar de los \\\mismos resultados. ¿Algunas ideas?

Eton B.
fuente
4
Acabo de corregir el error tipográfico en el título, pero hay algo profundamente asombroso en el título "¿No puedes escapar de la reacción violenta con expresiones regulares?" ¡En efecto!
Adam Crossland
1
@AdamCrossland ¿No deseamos todos que la expresión regular nos ayude a escapar de la reacción violenta? > _>
Eton B.
2
Diablos, solo desearía poder escapar de la reacción de regex.
Adam Crossland

Respuestas:

225

Si está poniendo esto en una cadena dentro de un programa, es posible que necesite usar cuatro barras diagonales inversas (porque el analizador de cadenas eliminará dos de ellas cuando lo "elimine" para la cadena , y luego la expresión regular necesita dos para una barra invertida de expresiones regulares de escape).

Por ejemplo:

regex("\\\\")

se interpreta como ...

regex("\\" [escaped backslash] followed by "\\" [escaped backslash])

se interpreta como ...

regex(\\)

se interpreta como una expresión regular que coincide con una sola barra invertida.


Dependiendo del idioma, es posible que pueda usar una forma diferente de citar que no analice las secuencias de escape para evitar tener que usar tantas, por ejemplo, en Python:

re.compile(r'\\')

El rdelante de las comillas lo convierte en una cadena sin procesar que no analiza los escapes de barra invertida.

Ámbar
fuente
14
jeje ... Me encontré con esto y necesitaba agregar tres. Seguí agregando barras invertidas hasta que funcionó.
billynoah
ummm, ¿por qué diablos esta expresión regular se reinterpreta dos veces en lugar de una vez, como se supone que debe ser para PCRE?
Jim Michaels
3
@JimMichaels porque no todos los lenguajes tienen literales de expresiones regulares sin escape y, por lo tanto, a veces el lenguaje de programación en sí mismo interpreta las barras de escape una vez en su sintaxis de cadena, y la cadena resultante se pasa al motor de expresiones regulares (que interpreta las barras de escape en la sintaxis de expresiones regulares).
Ámbar
1
una vez, hace mucho tiempo, tuve que capturar un xpath de un elemento cuya única característica de identificación era una ruta de archivo de Windows, luego generar un programa (como una cadena) en el que los xpaths se representarían como cadenas. en un punto de los pasos intermedios, se usaron 8 barras invertidas para representar una sola barra invertida en la ruta del archivo. Sin embargo, eso es lo más alto que he obtenido.
Zackkenyon
Esto puede volverse aún más complicado cuando se buscan barras invertidas junto con patrones que requieren metacaracteres. Tomemos, por ejemplo, la búsqueda de una barra invertida seguida de un dígito. Ahora usted estaría mirando a la siguiente expresión tratando de averiguar lo que está pasando: new RegExp('\\\\\\d');.
jabacchetta
15

Si no es un literal, debe usarlo \\\\para obtener lo \\que significa una barra invertida de escape.

Eso es porque hay dos representaciones. En la representación de cadena de su expresión regular, tiene "\\\\", que es lo que se envía al analizador. El analizador verá \\cuál interpreta como una barra invertida de escape válida (que coincide con una sola barra invertida).

Vivin Paliath
fuente
10

La barra invertida \es el carácter de escape de las expresiones regulares. Por lo tanto, una barra invertida doble significaría una barra invertida única y literal.

\ (backslash) followed by any of [\^$.|?*+(){} escapes the special character to suppress its special meaning.

ref: http://www.regular-expressions.info/reference.html

Puntilla
fuente
4

De http://www.regular-expressions.info/charclass.html :

Tenga en cuenta que los únicos caracteres especiales o metacaracteres dentro de una clase de caracteres son el corchete de cierre (]), la barra invertida (\\), el signo de intercalación (^) y el guión (-). Los metacaracteres habituales son caracteres normales dentro de una clase de carácter y no es necesario que se les escape una barra invertida. Para buscar una estrella o un signo más, use [+ *]. Su expresión regular funcionará bien si escapa de los metacaracteres normales dentro de una clase de carácter, pero hacerlo reduce significativamente la legibilidad.

Para incluir una barra invertida como un carácter sin ningún significado especial dentro de una clase de carácter, debe escapar con otra barra invertida. [\\ x] coincide con una barra invertida o una x. El corchete de cierre (]), el signo de intercalación (^) y el guión (-) se pueden incluir escapándolos con una barra invertida o colocándolos en una posición en la que no adquieran su significado especial. Recomiendo el último método, ya que mejora la legibilidad. Para incluir un símbolo de intercalación, colóquelo en cualquier lugar excepto justo después del corchete de apertura. [x ^] coincide con una x o un signo de intercalación. Puede colocar el corchete de cierre justo después del corchete de apertura o el símbolo de intercalación de negación. [] x] coincide con un corchete de cierre o una x. [^] x] coincide con cualquier carácter que no sea un corchete de cierre o una x. El guión se puede incluir justo después del corchete de apertura, o justo antes del corchete de cierre, o justo después del signo de intercalación de negación.

¿En qué idioma estás escribiendo la expresión regular?

Nate
fuente
0

Esta solución solucionó mi problema al reemplazar la etiqueta br a '\ n'.

alert(content.replace(/<br\/\>/g,'\n'));
hltsydmr
fuente