2008-10-03 14 views
12

En Java, supongamos que tengo una variable String S, y quiero buscar dentro de otra cadena t, así:Escapar una cadena de conseguir regex analiza en Java

if (T.matches(S)) ... 

(nota: la la línea de arriba era T.contains() hasta que algunas publicaciones señalaron que ese método no usa expresiones regulares. Mi mal.

Pero ahora supongamos que S puede tener caracteres desagradables. Por ejemplo, que S = "[hi". El corchete izquierdo hará que la expresión regular falle. ¿Hay alguna función a la que pueda llamar para escapar de S para que esto no suceda? En este caso particular, me gustaría que se transformara en "\ [hola"].

+1

Posible duplicado de [Cómo escanear texto para expresiones regulares en Java] (http://stackoverflow.com/questions/60160/how-to-escape-text-for-regular-expression-in-java) –

Respuesta

20

String.contains no utiliza expresiones regulares, por lo que no hay ningún problema en este caso.

Cuando se requiere una expresión regular, en lugar de rechazar cadenas con caracteres especiales de expresiones regulares, use java.util.regex.Pattern.quote para escapar de ellas.

2

¿Alguna razón en particular para no usar String.indexOf()? De esa forma, siempre se interpretará como una cadena regular en lugar de una expresión regular.

+1

Since Java 1.5 hay String # contains (...), que da como resultado un código más legible que indexOf (...). –

0

Regex usa la barra invertida '\' para escapar de un literal. Dado que Java utiliza también el carácter de barra invertida se tendría que usar un doble bashslash como:

String S = "\\[hi" 

que se convertirá en la cadena:

\[hi 

que se pasará a la expresión regular.

O si sólo se preocupan por una cadena literal y no necesita una expresión regular que podría hacer lo siguiente:

if (T.indexOf("[hi") != -1) { 
11

Como dijo Tom Hawtin, debe citar el patrón. Puede hacer esto de dos maneras (editar: en realidad tres maneras, como ha señalado @diastrophism):

  1. rodean la cadena con "\ Q" y "\ E", como:

    if (T.matches("\\Q" + S + "\\E")) 
    
  2. Use Pattern en su lugar. El código sería algo como esto:

    Pattern sPattern = Pattern.compile(S, Pattern.LITERAL); 
    if (sPattern.matcher(T).matches()) { /* do something */ } 
    

    De esta manera, puede almacenar en caché el patrón compilado y reutilizarlo. Si usa la misma expresión regular más de una vez, casi seguramente desea hacerlo de esta manera.

Tenga en cuenta que si está utilizando expresiones regulares para comprobar si una cadena está dentro de una cadena más grande, usted debe poner. * Al principio y al final de la expresión. Pero esto no funcionará si está citando el patrón, ya que entonces buscará puntos reales. Entonces, ¿estás absolutamente seguro de que quieres usar expresiones regulares?

Cuestiones relacionadas