82 votes

Remplacez toutes les occurences d'une Chaîne à l'aide de StringBuilder?

Ai-je raté quelque chose, ou ne StringBuilder pas le même "remplacer toutes les occurences d'une chaîne de caractères d'Une chaîne B de la fonction" que la normale de la classe String n'? Le StringBuilder remplacer la fonction n'est pas tout à fait le même. Est-il possible à présent de manière plus efficace, sans générer de multiples Cordes à l'aide de la normale de la classe String?

76voto

Jon Skeet Points 692016

Eh bien, vous pouvez écrire une boucle:

public static void replaceAll(StringBuilder builder, String from, String to)
{
    int index = builder.indexOf(from);
    while (index != -1)
    {
        builder.replace(index, index + from.length(), to);
        index += to.length(); // Move to the end of the replacement
        index = builder.indexOf(from, index);
    }
}

Notez que dans certains cas, il peut être plus rapide d'utiliser lastIndexOf, en travaillant à partir de l'arrière. Je pense que c'est le cas si vous êtes le remplacement d'une longue chaîne avec un court - de sorte que lorsque vous obtenez le début, tous les remplacements ont moins de copier. De toute façon, cela devrait vous donner un point de départ.

37voto

Ron Romero Points 2343

Vous pouvez utiliser le Pattern/Matcher. À partir de la Correspondance de la documentation javadoc:

 Pattern p = Pattern.compile("cat");
 Matcher m = p.matcher("one cat two cats in the yard");
 StringBuffer sb = new StringBuffer();
 while (m.find()) {
     m.appendReplacement(sb, "dog");
 }
 m.appendTail(sb);
 System.out.println(sb.toString());

13voto

Alfredo Osorio Points 3808

Regardez JavaDoc de replaceAll méthode de Chaîne de classe:

Remplace chaque sous-chaîne de la chaîne qui correspond à la régulière expression avec la donnée de remplacement. Une invocation de cette méthode de la forme str.replaceAll(regex, repl), on obtient exactement le même résultat comme l'expression

java.util.regex.De modèle.compiler(regex).matcher(str).replaceAll(repl)

Comme vous pouvez le voir, vous pouvez utiliser le Pattern et Matcher pour le faire.

2voto

Pierre Points 15256

java.util.regex.De modèle.matcher(CharSequence s) peut utiliser un StringBuilder comme un argument de sorte que vous pouvez rechercher et remplacer chaque occurence de votre modèle à l'aide de la méthode start() et end() sans appel de générateur.toString()

1voto

Anandan Points 21

Utiliser les éléments suivants:

/**
* Utility method to replace the string from StringBuilder.
* @param sb          the StringBuilder object.
* @param toReplace   the String that should be replaced.
* @param replacement the String that has to be replaced by.
* 
*/
public static void replaceString(StringBuilder sb,
                                 String toReplace,
                                 String replacement) {      
    int index = -1;
    while ((index = sb.lastIndexOf(toReplace)) != -1) {
        sb.replace(index, index + toReplace.length(), replacement);
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X