2012-05-09 14 views
5

Aquí está el problema: al usuario se le presenta un campo de texto, al cual puede teclear el filtro . Un filtro para filtrar datos no filtrados. El usuario, al experimentar un lavado de cerebro de Oracle Forms, no admite caracteres especiales que no sean%, lo que supongo que representa más o menos ". * * Regex en Java.Cómo escapar de todos los caracteres especiales Regex pero no de todos a la vez (por Pattern.quote()), solo uno por uno

Si la persona del usuario se comporta bien, determinada persona se escriba cosas como "CTHULH%", en cuyo caso se me permite construir un patrón:

Pattern.compile(inputText.replaceAll("%", ".*")); 

pero si la persona usuario es oriundo de Innsmouth, insuperablemente haré se escribe "+ \ [a - # $%^& * (." destruir mi esquema con unas pocas pulsaciones de teclas simples Esto no funcionará:

Pattern.compile(Pattern.quote(inputText).replaceAll("%", ".*")); 

ya que pondrá \ Q al principio y \ e. al final de la Cadena, renderizando mi% ->. * cambio irrelevante.

La pregunta es: ¿tengo que buscar cada carácter especial en el código de patrón y escapar de él mismo agregando "\\" al frente, o puede hacerse esto automágicamente? ¿O estoy tan metido en el problema, estoy omitiendo alguna forma obvia de resolución?

Respuesta

2

¿Qué hay de Pattern.compile(Pattern.quote(inputText).replaceAll("%", "\\E.*\\Q"));?

Esto debe resultar en el siguiente patrón:

input: ".+\[a-#$%^&*(" 
quote: \Q".+\[a-#$%^&*("\E 
replace: \Q".+\[a-#$\E.*\Q^&*("\E 

En caso de que el carácter % fue el primero o el último carácter que se obtendría un \Q\E (si sólo tiene la entrada % la expresión terminaría siendo \Q\E.*\Q\E) pero esto debería ser una expresión válida.

actualización:

I olvidó la diferencia entre replace(...) y replaceAll(...): el parámetro de reemplazo en el primero es un literal mientras que la sustitución en este último es una expresión en sí. Por lo tanto, como ya indicó en su comentario, necesita llamar al Pattern.compile(Pattern.quote(inputText).replaceAll("%", "\\\\E.*\\\\Q")); (cite las barras diagonales inversas en la cadena y en la expresión).

De la documentación sobre String#replaceAll(...):

Tenga en cuenta que las barras invertidas en la cadena de reemplazo pueden causar que los resultados sean diferentes que si estuviera siendo tratado como una cadena de reemplazo literal.

+0

+1 Pero no estoy seguro de que la documentación del método 'quote' * garantice * que una cadena siempre estará rodeada por' \ Q' y '\ E' (solo dice" Este método produce una cadena que puede se usará para crear un Patrón que coincida con la cadena s como si fuera un patrón literal. "). Aunque en la práctica creo que todas las impedancias actuales de Java usan el enfoque '\ Q ... \ E' para lograr esto. –

+0

@Thomas disculpe la pregunta de novato: ¿cuál es la costumbre aquí? ¿Borro mis comentarios cuando actualizas la respuesta? –

+0

@pafauk. Hmm, no estoy seguro, pero si los comentarios no proporcionan ninguna información adicional (que creo que es cierto de nuestros comentarios ahora), los eliminaría para mantener la publicación clara. Comenzaré y borraré mis comentarios anteriores. – Thomas

6

creo que este algoritmo debe trabajar para usted:

  • Split, en %
  • Cita cada parte por separado utilizando Pattern.quote
  • Únete a la cadena mediante .*
+0

Gracias! Agradable y limpio, aunque necesita algo de trabajo para recordar si hubo un% al principio y/o al final de la secuencia. –

Cuestiones relacionadas