2010-10-26 26 views
82

estoy usando la siguiente expresión regular¿No se puede escapar de la barra diagonal inversa con expresiones regulares?

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

Sé que es feo, pero hasta ahora cumple su función distinta de la barra invertida no está permitido, ya que creo que debería porque se escapó, yo también trató \\ en lugar de \\\ pero los mismos resultados. ¿Algunas ideas?

+2

¿Qué idioma? ¿Está cotizado? –

+2

Acabo de corregir el error tipográfico en el título, pero hay algo profundamente sorprendente sobre el título "No se puede escapar de la reacción con expresiones regulares?" ¡En efecto! –

+1

@AdamCrossland ¿No todos deseamos que Regex nos ayude a escapar de la reacción? > _> –

Respuesta

156

Si usted está poniendo esto en una cadena dentro de un programa, es posible que en realidad tenga que usar cuatro barras invertidas (porque el analizador de cadena eliminará dos de ellos cuando "de-escape" para la cadena , y luego la expresión regular necesita dos para una barra invertida regex escapada).

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 utilizar una forma diferente de citar que no analiza las secuencias de escape para evitar tener que utilizar la mayor cantidad - por ejemplo, en Python:

re.compile(r'\\') 

El r delante de las comillas lo convierte en cadena que no analiza los escapes de la barra invertida.

+7

jeje ... Acabo de toparme con esto y necesitaba agregar tres. Seguí agregando barras invertidas hasta que funcionó. – billynoah

+0

ummm, ¿por qué diablos se reinterpreta esta expresión regular dos veces en vez de una vez como se supone que es para PCRE? –

+0

Sí ... se necesitan 4 barras invertidas !! ??? – Andrew

8

Si no es un literal, tiene que usar \\\\ para que obtenga \\ lo que significa una barra invertida escapada.

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á \\ que interpreta como una barra diagonal escapada válida (que coincide con una sola barra invertida).

7

La barra diagonal inversa \ es el carácter de escape para las expresiones regulares. Por lo tanto, una doble barra invertida significaría una sola barra invertida literal.

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

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

3

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

Tenga en cuenta que los únicos caracteres especiales o meta-caracteres dentro de una clase de caracteres son el corchete de cierre (]), la barra invertida (\\), el símbolo de intercalación (^) y el guión (-). Los metacaracteres habituales son caracteres normales dentro de una clase de caracteres, y no necesitan ser escapados por una barra invertida. Para buscar una estrella o más, use [+ *]. Su expresión regular funcionará bien si escapa de los metacaracteres regulares dentro de una clase de caracteres, pero al hacerlo reduce significativamente la legibilidad.

Para incluir una barra diagonal inversa como un personaje sin ningún significado especial dentro de una clase de caracteres, tiene que escapar con otra barra invertida. [\\ x] coincide con una barra invertida o una x. El corchete de cierre (]), el corchete (^) y el guión (-) se pueden incluir escapándolos con una barra invertida, o colocándolos en una posición en la que no adquieren su significado especial. Recomiendo este último método, ya que mejora la legibilidad. Para incluir un símbolo de intercalación, colóquelo en cualquier lugar excepto inmediatamente después del corchete de apertura. [x ^] coincide con una x o una referencia. Puede colocar el corchete de cierre justo después del corchete de apertura o el corsé 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 inmediatamente después del corsé de negación. Ambos [-x] y [x-] coinciden con una x o un guión.

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

0

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

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