web-dev-qa-db-fra.com

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

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

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

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

       }
}
61
user42155

Essayez d'utiliser String.replace() ou String.replaceAll() à la place.

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

(Les deux remplacent toutes les occurrences; replaceAll permet l'utilisation de regex.)

112
Amber

La réponse simple est:

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

Malgré le nom comparé à replaceAll, replace ne fait pas replaceAll, il n’utilise pas d’expression régulière, ce qui semble aller dans l’ordre (du point de vue des performances et des bonnes pratiques) - n’utilisez pas les expressions régulières par accident car ils ont des exigences de caractère particulières auxquelles vous ne ferez pas attention).

La réponse de Sean Bright est probablement tout aussi intéressante qu'il convient de réfléchir du point de vue des performances, sans autre exigence cible en termes de performances et de tests de performances, si vous savez déjà que ce code est un point chaud pour les performances, si c'est de là que vient la question. Cela ne mérite certainement pas les votes négatifs. Utilisez simplement StringBuilder au lieu de StringBuffer sauf si vous avez besoin de la synchronisation.

Cela étant dit, il existe un problème potentiel un peu plus profond ici. L'échappement de caractères est un problème connu auquel de nombreuses bibliothèques s'adressent. Vous pouvez envisager de regrouper les données dans une section CDATA dans le fichier XML ou d’utiliser une bibliothèque XML (y compris celle livrée avec le JDK) pour générer le code correctement (afin qu’il gère le codage). ).

Apache a aussi une librairie échappée dans le cadre de Commons Lang.

88
Yishai
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("&lt;");
            break;
        case '>':
            s.append("&gt;");
            break;
        default:
            s.append(ch);
            break;
    }
}

token = s.toString();
14
Sean Bright

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

Par exemple: 

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

Cela entraînerait la chaîne "sdasdasa&amp;adas&amp;dasdasa".

Le motif de regex "& (?! Amp;)" indique essentiellement: Faites correspondre toute occurrence de "&" non suivie de "amp;".

8
Robert Durgin

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

String result = yourString.replaceAll("&", "&amp;");
4
Taylor Leese

Échapper à des chaînes peut être délicat - surtout si vous souhaitez prendre en compte l’unicode. Je suppose que XML est l’un des formats/langages les plus simples à échapper, mais quand même. Je recommanderais de jeter un coup d'œil à la classe StringEscapeUtils dans Apache Commons Lang et à sa méthode escapeXml .

1
Chris Vest

Essayez ce code.Vous pouvez remplacer n’importe quel caractère par un autre caractère donné ..__ Ici, j’ai essayé de remplacer la lettre 'a' par "-" caractère pour la chaîne de caractères "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");
    }

}
1
chamzz.dot

Regardez this method.

0
IRBMe
//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);
            }
        }
    }
0
user2125311

Si vous utilisez Spring, vous pouvez simplement appeler HtmlUtils.htmlEscape(String input) qui gérera la traduction '&' vers '&'.

0
Adamski