Come sostituire un carattere in una stringa in Java?

Usando Java, voglio passare attraverso le linee di un testo e sostituire tutti i simboli & commerciale ( & ) con l’XML entity reference & .

Esamino le righe del testo e poi ogni parola nel testo con la class Scanner. Quindi uso CharacterIterator per scorrere su ogni carattere della parola. Tuttavia, come posso sostituire il personaggio? Innanzitutto, le stringhe sono oggetti immutabili. Secondo, voglio sostituire un carattere ( & ) con diversi caratteri ( amp&; ). Come dovrei avvicinarmi a questo?

 CharacterIterator it = new StringCharacterIterator(token); for(char ch = it.first(); ch != CharacterIterator.DONE; ch = it.next()) { if(ch == '&') { } } 

Prova invece a utilizzare String.replace() o String.replaceAll() .

 String my_new_str = my_str.replace("&", "&"); 

(Entrambi sostituiscono tutte le occorrenze; replaceAll consente l’uso di regex.)

La risposta semplice è:

 token = token.replace("&", "&"); 

Nonostante il nome rispetto a replaceAll, replace fa un replaceAll, semplicemente non usa un’espressione regolare, che sembra essere in ordine qui (sia dal punto di vista delle prestazioni che di una buona pratica – non usare le espressioni regolari per caso in quanto hanno requisiti di carattere speciali a cui non dovrai prestare attenzione).

La risposta di Sean Bright è probabilmente altrettanto valida che vale la pena pensare da un punto di vista delle prestazioni in assenza di ulteriori requisiti di objective in termini di prestazioni e test delle prestazioni, se già sapete che questo codice è un punto caldo per le prestazioni, se è da lì che viene la vostra domanda. Certamente non merita i downvotes. Basta usare StringBuilder invece di StringBuffer a meno che non sia necessaria la sincronizzazione.

Detto questo, c’è un potenziale problema un po ‘più profondo qui. La fuga di caratteri è un problema noto che molte librerie là fuori indirizzano. Potresti considerare di includere i dati in una sezione CDATA nell’XML, o potresti preferire usare una libreria XML (inclusa quella che ora viene fornita con JDK) per generare correttamente l’XML (in modo che gestisca la codifica ).

Apache ha anche una libreria di escape come parte di Commons Lang.

 StringBuilder s = new StringBuilder(token.length()); CharacterIterator it = new StringCharacterIterator(token); for (char ch = it.first(); ch != CharacterIterator.DONE; ch = it.next()) { switch (ch) { case '&': s.append("&"); break; case '<': s.append("<"); break; case '>': s.append(">"); break; default: s.append(ch); break; } } token = s.toString(); 

Si consiglia inoltre di verificare che non sostituisca un’occorrenza che è già stata sostituita. Puoi usare un’espressione regolare con lookahead negativo per farlo.

Per esempio:

String str = "sdasdasa&adas&dasdasa";
str = str.replaceAll("&(?!amp;)", "&");

Ciò comporterebbe la stringa “sdasdasa & adas & dasdasa”.

Il modello regex “& (?! amp;)” in pratica dice: corrisponde a qualsiasi occorrenza di “&” che non sia seguita da “amp;”.

Basta creare una stringa che contenga tutti i dati in questione e quindi utilizzare String.replaceAll () come di seguito.

 String result = yourString.replaceAll("&", "&"); 

L’escaping delle stringhe può essere complicato , specialmente se si desidera prendere in considerazione l’unicode. Suppongo che XML sia uno dei formati / linguaggi più semplici da sfuggire ma comunque. Consiglierei di dare un’occhiata alla class StringEscapeUtils in Apache Commons Lang e al suo pratico metodo escapeXml .

Prova questo codice. Puoi sostituire qualsiasi personaggio con un altro personaggio. Qui ho provato a sostituire la lettera ‘a’ con il carattere “-“ per la stringa “abcdeaa”

OutPut -> _ bcdef__

  public class Replace { public static void replaceChar(String str,String target){ String result = str.replaceAll(target, "_"); System.out.println(result); } public static void main(String[] args) { replaceChar("abcdefaa","a"); } } 

Se usi Spring, puoi semplicemente chiamare HtmlUtils.htmlEscape(String input) che gestirà la traduzione “&” in “&”.

Dai un’occhiata a questo metodo.

 //I think this will work, you don't have to replace on the even, it's just an example. public void emphasize(String phrase, char ch) { char phraseArray[] = phrase.toCharArray(); for(int i=0; i< phrase.length(); i++) { if(i%2==0)// even number { String value = Character.toString(phraseArray[i]); value = value.replace(value,"*"); phraseArray[i] = value.charAt(0); } } }