Comment remplacer un caractère dans une chaîne en Java?

En utilisant Java, je veux parcourir les lignes d’un texte et remplacer tous les symboles d’esperluette ( & ) par la référence d’entité XML & .

Je numérise les lignes du texte puis chaque mot du texte avec la classe Scanner. Ensuite, j’utilise CharacterIterator pour parcourir chaque caractère du mot. Cependant, comment puis-je remplacer le personnage? Tout d’abord, les chaînes sont des objects immuables. Deuxièmement, je veux remplacer un caractère ( & ) par plusieurs caractères ( amp&; ). Comment devrais-je aborder cela?

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

Essayez d’utiliser Ssortingng.replace() ou Ssortingng.replaceAll() place.

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

(Les deux remplacent toutes les occurrences; replaceAll permet d’utiliser regex.)

La réponse simple est:

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

Malgré le nom par rapport à replaceAll, replace fait un replaceAll, il n’utilise simplement pas une expression régulière, qui semble être dans l’ordre ici (tant du sharepoint vue des performances que des bonnes pratiques – n’utilisez pas des expressions régulières par accident) comme ils ont des exigences de caractère spéciales que vous ne ferez pas attention à).

La réponse de Sean Bright est probablement aussi intéressante qu’il est utile de le faire du sharepoint vue des performances, en l’absence de toute autre exigence concernant les tests de performances et de performances, si vous connaissez déjà ce code. Cela ne mérite certainement pas les inconvénients. Utilisez simplement SsortingngBuilder au lieu de SsortingngBuffer, sauf si vous avez besoin de la synchronisation.

Cela étant dit, il y a un problème potentiel un peu plus profond ici. Échapper aux caractères est un problème connu auquel beaucoup de bibliothèques ont à faire face. Vous voudrez peut-être envisager d’envelopper les données dans une section CDATA dans le XML, ou vous pouvez préférer utiliser une bibliothèque XML (y compris celle fournie avec le JDK maintenant) pour générer le code XML correctement (afin de gérer le codage). ).

Apache possède également une bibliothèque qui s’échappe dans le cadre de Commons Lang.

 SsortingngBuilder s = new SsortingngBuilder(token.length()); CharacterIterator it = new SsortingngCharacterIterator(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.toSsortingng(); 

Vous pouvez également vérifier que vous ne remplacez pas un événement déjà remplacé. Pour ce faire, vous pouvez utiliser une expression régulière avec une recherche négative.

Par exemple:

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

Cela donnerait la chaîne “sdasdasa & adas & dasdasa”.

Le motif regex “& (?! amp;)” dit en gros: Correspond à toute occurrence de ‘&’ qui n’est pas suivie de ‘amp;’.

Créez simplement une chaîne contenant toutes les données en question, puis utilisez Ssortingng.replaceAll () comme ci-dessous.

 Ssortingng result = yourSsortingng.replaceAll("&", "&"); 

Les chaînes qui s’échappent peuvent être délicates , surtout si vous souhaitez prendre en compte unicode. Je suppose que XML est l’un des formats / langages les plus simples pour s’échapper mais quand même. Je recommanderais de jeter un coup d’oeil à la classe SsortingngEscapeUtils dans Apache Commons Lang, et à sa méthode pratique escapeXml .

Essayez ce code. Vous pouvez remplacer n’importe quel personnage par un autre caractère donné. Ici, j’ai essayé de remplacer la lettre “a” par le caractère “-“ pour la chaîne “abcdeaa”.

OutPut -> _ bcdef__

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

Si vous utilisez Spring, vous pouvez simplement appeler HtmlUtils.htmlEscape(Ssortingng input) pour gérer la traduction “& ‘to” & “.

Jetez un oeil à cette méthode.

 //I think this will work, you don't have to replace on the even, it's just an example. public void emphasize(Ssortingng 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); } } }