Pregunta

En Java, supongamos que tengo una variable de cadena S, y quiero buscarla dentro de otra cadena T, de esta forma:

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

(nota: la línea anterior fue T.contains () hasta que algunas publicaciones indicaron que ese método no usa expresiones regulares. Mi error)

Pero ahora supongamos que S puede tener caracteres desagradables. Por ejemplo, sea S = " [hi " ;. El corchete izquierdo hará que la expresión regular falle. ¿Hay una 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 transforme a " \ [hi " ;.

¿Fue útil?

Solución

String.contains no usa 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.

Otros consejos

Como Tom Hawtin dijo: Necesitas citar el patrón. Puede hacer esto de dos maneras (edite: en realidad de tres maneras, como lo indica @ diastrofismo ):

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

    if (T.matches("\\Q" + S + "\\E"))
    
  2. Utilice Patrón 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 está utilizando la misma expresión regular más de una vez, es casi seguro que desee 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, debe poner. * al principio y al final de la expresión. Pero esto no funcionará si está citando el patrón, ya que entonces estará buscando puntos reales. Entonces, ¿estás absolutamente seguro de que deseas utilizar expresiones regulares?

Pruebe Pattern.quote (String) . Arreglará todo lo que tenga un significado especial en la cadena.

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

Regex usa el carácter de barra invertida '\' para escapar de un literal. Dado que java también usa el carácter de barra invertida, necesitarías usar una doble barra de barra como:

   String S = "\\[hi"

Eso se convertirá en la Cadena:

  \[hi

que se pasará a la expresión regular.

O si solo te importa una cadena literal y no necesitas una expresión regular, puedes hacer lo siguiente:

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

T.contains () (según javadoc: http://java.sun.com/javase/6/docs/api/java/lang/String.html ) no utiliza expresiones regulares. contiene () delegados a indexOf () solamente.

Por lo tanto, NO hay expresiones regulares utilizadas aquí. ¿Estabas pensando en algún otro método de cadena?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top