2009-07-16 27 views
22

tengo lista separada por comas de expresiones regulares separado:¿Cómo escapar de un corchete para la compilación del patrón

.{8},[0-9],[^0-9A-Za-z ],[A-Z],[a-z] 

he hecho una división en la coma. Ahora trato de hacer coincidir esta expresión regular con una contraseña generada. El problema es que Pattern.compile no le gustan los corchetes que no se han escapado. ¿Pueden algunos por favor darme una función simple que toma una cadena como así: [0-9] y devuelve la cadena escapada \[0-9\].

Respuesta

11

Puede usar los caracteres especiales \ Q y \ E ... cualquier cosa entre \ Q y \ E se escapa automáticamente.

\Q[0-9]\E 
+0

Suena un poco pernicioso si me preguntas, lo has probado en Java (no lo he hecho, es por eso que pregunto). – Fredrik

+1

También es válido en Java: http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html (ctrl-F para "\ Q") – MatrixFrog

+5

En formato literal de cadena de Java sería "\\ Q [0-9] \\ E" o "\\ Q" + regex + "\\ E". Pero el método quote() lo hace por usted, además de que trata correctamente cadenas que ya tienen \ E en ellas. –

1

Pattern.compile() le gusta square brackets just fine. Si se toma la cadena

".{8},[0-9],[^0-9A-Za-z ],[A-Z],[a-z]" 

, que se dividió en comas, se termina con cinco expresiones regulares perfectamente válidas: la primera coincide con ocho caracteres sin línea de separación, el segundo coincide con un dígito ASCII, y así sucesivamente. A menos que realmente quiera emparejar cadenas como ".{8}" y "[0-9]", no veo por qué tendría que escapar de algo.

23

Por alguna razón, la respuesta anterior no funcionó para mí. Para aquellos como yo que vienen después, esto es lo que encontré.

Estaba esperando que una barra invertida salga del soporte, sin embargo, debe usar dos si tiene el patrón almacenado en una cadena. La primera barra invertida escapa de la segunda en la cadena, de modo que lo que ve Regex es \]. Como Regex solo ve una barra invertida, la usa para escapar del corchete.

\\] 

En regex, que coincidirá con un solo corchete de cierre.

Si está intentando hacer coincidir una línea nueva, por ejemplo, solo usaría una sola barra invertida. Está utilizando el patrón de escape de cadena para insertar un carácter de nueva línea en la cadena. Regex no ve \n - ve el carácter de nueva línea y lo combina. Necesitas dos barras diagonales inversas porque no es una secuencia de escape de cadenas, es una secuencia de escape de expresiones regulares.

+2

Al pensarlo, surgió el motivo por el que esto es así: la expresión regular es una Cadena y cualquiera que sea el proceso, esta expresión buscará una sola espalda como personaje de escape. Sin embargo, como la expresión regular se transmite como una cadena, también debes escapar de la espalda para conseguirla en una secuencia correctamente y ese es el motivo por el que necesitas dos barras invertidas. – Raven

Cuestiones relacionadas