¿Tiene Java una forma integrada de escapar del texto arbitrario para que pueda incluirse en una expresión regular? Por ejemplo, si mis usuarios ingresan "$ 5", me gustaría hacer coincidir exactamente eso en lugar de un "5" después del final de la entrada.
320
\Q
y\E
. Esto puede conducir a resultados inesperados, por ejemplo,Pattern.quote("*.wav").replaceAll("*",".*")
dará como resultado\Q.*.wav\E
y no.*\.wav
, como es de esperar."mouse".toUpperCase().replaceAll("OUS","ic")
, volveráMicE
. Usted would't espera que devuelvaMICE
porque no aplicótoUpperCase()
sobreic
. En mi ejemplo, tambiénquote()
se aplica en el.*
insertetreplaceAll()
. Tienes que hacer otra cosa, tal vez.replaceAll("*","\\E.*\\Q")
funcionaría, pero eso es contradictorio.*.wav
en el patrón de\*\.wav
expresiones regulares , y el replaceAll lo convertiría en\.*\.wav
, lo que significa que sería coincide con archivos cuyo nombre consiste en un número arbitrario de períodos seguidos de.wav
. Lo más probablereplaceAll("\\*", ".*")
es que lo hubieras necesitado si se hubieran ido con la implementación más frágil que se basa en reconocer todos los caracteres de expresiones regulares activos posibles y escapar de ellos individualmente ... ¿sería eso mucho más fácil?La diferencia entre
Pattern.quote
yMatcher.quoteReplacement
no estaba clara para mí antes de ver el siguiente ejemplofuente
Pattern.quote
reemplaza caracteres especiales en cadenas de búsqueda de expresiones regulares, como. | + (), Etc., yMatcher.quoteReplacement
reemplaza caracteres especiales en cadenas de reemplazo, como \ 1 para referencias posteriores.quoteReplacement
solo se preocupa por los dos símbolos$
y\
que, por ejemplo, se pueden usar en cadenas de reemplazo como referencias$1
o\1
. Por lo tanto, no debe usarse para escapar / citar una expresión regular.$Group$
conT$UYO$HI
. El$
símbolo es especial tanto en el patrón como en el reemplazo:"$Group$ Members".replaceFirst(Pattern.quote("$Group$"), Matcher.quoteReplacement("T$UYO$HI"))
Puede ser demasiado tarde para responder, pero también puede usarlo
Pattern.LITERAL
, lo que ignoraría todos los caracteres especiales al formatear:fuente
Pattern.CASE_INSENSITIVE
Creo que lo que buscas es
\Q$5\E
. Ver tambiénPattern.quote(s)
introducido en Java5.Ver Patrón javadoc para más detalles.
fuente
En primer lugar, si
no pondrá un 1 al final. Verá la expresión regular de búsqueda para el primer grupo coincidente y el sub ESO en. Eso es lo que significa $ 1, $ 2 o $ 3 en el texto de reemplazo: grupos coincidentes del patrón de búsqueda.
Con frecuencia conecto cadenas largas de texto en archivos .properties, luego genero asuntos y cuerpos de correo electrónico a partir de ellos. De hecho, esta parece ser la forma predeterminada de hacer i18n en Spring Framework. Pongo etiquetas XML, como marcadores de posición, en las cadenas y uso replaceAll () para reemplazar las etiquetas XML con los valores en tiempo de ejecución.
Me encontré con un problema en el que un usuario ingresaba una cifra de dólares y centavos, con un signo de dólar. replaceAll () se atragantó, con lo siguiente apareciendo en una pista de seguimiento:
En este caso, el usuario había ingresado "$ 3" en algún lugar de su entrada y replaceAll () fue a buscar en la expresión regular de búsqueda para el tercer grupo coincidente, no encontró uno y vomitó.
Dado:
reemplazando
con
resuelve el problema. El usuario puede ingresar cualquier tipo de caracteres, incluidos los signos de dólar, sin problema. Se comportó exactamente de la manera que cabría esperar.
fuente
Para tener un patrón protegido, puede reemplazar todos los símbolos con "\\\\", excepto dígitos y letras. Y después de eso, puede poner en ese patrón protegido sus símbolos especiales para hacer que este patrón funcione no como un texto citado estúpido, sino realmente como un patrón, sino el suyo. Sin símbolos especiales de usuario.
fuente
Pattern.quote ("blabla") funciona muy bien.
Pattern.quote () funciona muy bien. Encierra la oración con los caracteres " \ Q " y " \ E ", y si se escapa "\ Q" y "\ E". Sin embargo, si necesita hacer un escape de expresión regular real (o un escape personalizado), puede usar este código:
Este método devuelve: Algunos / \ s / wText * / \, **
Código por ejemplo y pruebas:
fuente
El símbolo ^ (Negación) se usa para hacer coincidir algo que no está en el grupo de caracteres.
Este es el enlace a las expresiones regulares
Aquí está la información de la imagen sobre la negación:
fuente