El Pattern.quote(String s)
tipo de hace lo que quieres. Sin embargo, deja un poco que desear; en realidad no se escapa de los caracteres individuales, solo envuelve la cadena con \Q...\E
.
No existe un método que haga exactamente lo que está buscando, pero la buena noticia es que en realidad es bastante simple escapar de todos los caracteres especiales en una expresión regular de Java:
regex.replaceAll("[\\W]", "\\\\$0")
¿Por qué funciona esto? Bueno, la documentación para Pattern
específicamente dice que está permitido escapar de los caracteres no alfabéticos que no necesariamente tienen que escaparse:
Es un error usar una barra invertida antes de cualquier carácter alfabético que no denote una construcción de escape; estos están reservados para futuras extensiones del lenguaje de expresiones regulares. Se puede usar una barra invertida antes de un carácter no alfabético independientemente de si ese carácter es parte de una construcción sin escape.
Por ejemplo, ;
no es un carácter especial en una expresión regular. Sin embargo, si lo escapas, Pattern
aún se interpretará \;
como ;
. Aqui hay algunos ejemplos mas:
>
se convierte en lo \>
que es equivalente a>
[
se convierte en \[
cuál es la forma escapada de[
8
está quieto 8
.
\)
se convierte en lo \\\)
que son las formas escapadas \
y (
concatenadas.
Nota: La clave es la definición de "no alfabético", que en la documentación realmente significa caracteres "que no son palabras " o caracteres fuera del conjunto de caracteres [a-zA-Z_0-9]
.