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?
Réponses
Trop de publicités?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.
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());
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.
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()
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);
}
}