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

Qualcuno può aiutarmi perché sostituire in questo modo. ". *" tutti i caratteri in una stringa originale e sostituirli con "JAVA". Perché questo restituisce "JAVAJAVA".voglio sostituire un intera stringa con nuovo valore utilizzando il metodo String replaceAll in Java

+0

Puoi provare ". +" Come espressione regolare? Forse la corrispondenza considera la stringa vuota una sottostringa di qualsiasi stringa e quindi il contenuto effettivo della stringa come una seconda sottostringa, sostituendosi quindi due volte? Più di un colpo nel buio di qualsiasi cosa però. –

risposta

13

L'espressione regolare può corrispondere a 0 a tutti i caratteri. Innanzitutto, corrisponde all'intera stringa "Welcome to Java World", quindi corrisponde alla fine della stringa "", sostituendo entrambi con "JAVA".

Per fare in modo che funzioni come te lo aspetti, hai un paio di opzioni.

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

Nota il + al posto del *, questo significa 1 o più, quindi la fine non verrà confrontata.

o

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

Questo sostituirà solo l'intera stringa con "JAVA", l'estremità vuota della stringa non verrà sostituita.

+0

+1, forse conosci un link in cui questo (intendo come, dove e perché ogni stringa contiene la sottostringa vuota) è spiegato in dettaglio? È in qualche modo sorprendente, anche se non è difficile da capire. –

+0

Penso che la posizione più chiara per questo tipo di cose sia la [fonte stessa] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/util /regex/Matcher.java#Matcher.replaceAll%28java.lang.String%29). Ci vorrà un po 'di spicchi in quella classe per capire veramente cosa sta succedendo, ma questo è [il modo migliore] (http://blog.codinghorror.com/learn-to-read-the-source-luke/) per davvero capire. –

1

Non è necessario replaceAll per la vostra missione. La stessa semantica esatti sono raggiunti semplicemente affermando

System.out.println("JAVA"); 

Dal String è immutabile in Java, non è possibile evitare di ottenere un nuovo oggetto.

+0

Non molto pertinente alla domanda poiché si tratta di espressioni regolari, non di come avere una stringa contiene il contenuto che desidera. –

+0

Non sono sicuro che si tratti di regex. La domanda non lo ha motivato. –

1

perché utilizzare "replaceAll" e non "="? stringhe sono immutabili in Java

1

È inoltre possibile utilizzare il formato di seguito x.replaceAll ("Java" "* \ z.");

As. * Corrisponderà fino alla fine della stringa e \ z corrisponderà alla fine del carattere di stringa.

Problemi correlati