validador util regulares online number javatpoint expresiones java regex string escaping

util - Escapar de una cadena de obtener regex analizado en Java



replaceall java regex (6)

En Java, supongamos que tengo una variable String S, y quiero buscarla dentro de otra String T, así:

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

(nota: la línea anterior 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"].


¿Alguna razón en particular para no usar String.indexOf () en su lugar? De esa forma, 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 diagonal inversa, necesitarías usar una barra bash doble como la siguiente:

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, podrías hacer lo siguiente:

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


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.



Como dijo Tom Hawtin , necesitas citar el patrón. Puedes hacer esto de dos maneras (editar: en realidad tres formas, como lo señala @ diastrofismo ):

  1. Rodee la cuerda con "/ Q" y "/ E", como:

    if (T.matches("//Q" + S + "//E"))

  2. Use 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 forma, 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 probar si una cadena está dentro de una cadena más grande, debe poner. * Al inicio 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?