2012-05-04 14 views
7
String x = "Welcome to Java World"; 
System.out.println(x.replaceAll(".*","JAVA")); 
Actual Output = "JAVAJAVA" . 
Excepted Output = "JAVA". 

¿Alguien puede ayudar a por qué lo reemplaza así? ". *" todos los caracteres en una cadena original y reemplazar esto con "JAVA". Por qué esto devuelve "JAVAJAVA".Quiero reemplazar una Cadena completa con un nuevo valor utilizando el método String replaceAll en Java

+0

¿Podría probar ". +" Como la expresión regular? Tal vez la coincidencia considere la Cadena vacía como una subcadena de cualquier Cadena, y luego el contenido real de la Cadena como una segunda subcadena, reemplazando así dos veces. Más de un tiro en la oscuridad que cualquier otra cosa. –

Respuesta

13

Su expresión regular puede coincidir 0 con todos los caracteres. En primer lugar, coincide con toda la cadena "Welcome to Java World", luego coincide con el final de la cadena "", reemplazando ambos con "JAVA".

Para hacer que esto funcione como lo espera, tiene un par de opciones.

String x = "Welcome to Java World"; 
System.out.println(x.replaceAll(".+","JAVA")); 

Aviso del + en lugar del *, esto significa 1 o muchos, por lo que al final no será igualado.

o

String x = "Welcome to Java World"; 
System.out.println(x.replaceFirst(".*","JAVA")); 

Esto sólo reemplazar toda la cadena con "JAVA", al final de la cadena vacía no será reemplazado.

+0

+1, ¿tal vez conozca un enlace donde se explica en detalle esto (me refiero a cómo, dónde y por qué cada Cadena contiene la subcadena vacía)? Es algo sorprendente, aunque no difícil de entender. –

+0

Creo que la ubicación más clara para este tipo de cosas es la [fuente misma] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/util /regex/Matcher.java#Matcher.replaceAll%28java.lang.String%29). Tomará algunos reparos en esa clase para realmente entender lo que está sucediendo, pero esa es [la mejor manera] (http://blog.codinghorror.com/learn-to-read-the-source-luke/) para realmente entender. –

1

No necesita replaceAll para su misión. Exactamente las mismas semántica se consiguen simplemente indicando

System.out.println("JAVA"); 

Desde String es inmutable en Java, no se puede evitar de conseguir un nuevo objeto.

+0

No es realmente relevante para la pregunta, ya que se trata de expresiones regulares, no de cómo hacer que una cadena contenga el contenido que desea. –

+0

No estoy seguro de que se trate de expresiones regulares. La pregunta no lo motivó. –

1

¿por qué usar "replaceAll" y no "="? Las cadenas son inmutables en java

1

También puede usar el siguiente formato x.replaceAll (". * \ Z", "JAVA");

As. * Coincidirá hasta antes del final de la cadena y \ z coincidirá con el final del carácter de cadena.

Cuestiones relacionadas