用StringBuilderreplace所有出现的string?

我缺less的东西,还是StringBuilder缺乏相同的“replace所有出现的stringAstringB”function,正常的string类? StringBuilderreplace函数并不完全相同。 有没有办法更有效地使用正常的String类生成多个string?

那么,你可以写一个循环:

 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); } } 

请注意,在某些情况下,使用lastIndexOf可能会更快,从后面工作。 如果你用一个较长的stringreplace一个长string,我怀疑是这种情况 – 所以当你开始的时候,任何replace都有较less的拷贝。 无论如何,这应该给你一个出发点。

你可以使用模式 / 匹配器 。 从匹配器javadocs:

  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()); 

查看String类的replaceAll方法的JavaDoc:

用给定的replacereplace此string中与给定正则expression式匹配的每个子string。 对str.replaceAll(regex,repl)forms的此方法的调用产生与expression式完全相同的结果

java.util.regex.Pattern.compile(正则expression式).matcher(STR).replaceAll(REPL)

正如你所看到的,你可以使用PatternMatcher来做到这一点。

Apache Commons Lang中的 org.apache.commons.lang3.text.StrBuilder类允许replace:

 public StrBuilder replaceAll(String searchStr, String replaceStr) 

* 这不会收到一个正则expression式,而是一个简单的string。

@Adam:我想在你的代码片段中,你应该跟踪m.find()的开始位置,因为stringreplace可能会改变匹配的最后一个字符后的偏移量。

 public static void replaceAll(StringBuilder sb, Pattern pattern, String replacement) { Matcher m = pattern.matcher(sb); int start = 0; while (m.find(start)) { sb.replace(m.start(), m.end(), replacement); start = m.start() + replacement.length(); } } 

java.util.regex.Pattern.matcher(CharSequence s)可以使用StringBuilder作为参数,所以你可以在不调用builder.toString()的情况下使用start()和end()来查找和replace每个模式的出现。

使用以下内容:

 /** * 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); } } 

即使简单的一个是使用String ReplaceAll函数本身。 你可以把它写成

 StringBuilder sb = new StringBuilder("Hi there, are you there?") System.out.println(Pattern.compile("there").matcher(sb).replaceAll("niru")); 

这里有一个replaceAll,它将修改在StringBuilder中传递的内容。 我以为我会发布这个,因为我正在寻找replaceAll出来创build一个新的string。

 public static void replaceAll(StringBuilder sb, Pattern pattern, String replacement) { Matcher m = pattern.matcher(sb); while(m.find()) { sb.replace(m.start(), m.end(), replacement); } } 

我很震惊,这样做的代码是多么简单(出于某种原因,我认为改变StringBuilder而使用匹配器会抛出组的开始/结束,但它不)。

这可能比其他正则expression式的答案更快,因为模式已经编译,你不创build一个新的string,但我没有做任何基准。

如何创build一个方法,让String.replaceAll为你做:

 public static void replaceAll(StringBuilder sb, String regex, String replacement) { String aux = sb.toString(); aux = aux.replaceAll(regex, replacement); sb.setLength(0); sb.append(aux); } 
 public static String replaceCharsNew(String replaceStr,Map<String,String> replaceStrMap){ StringBuilder replaceStrBuilder = new StringBuilder(replaceStr); Set<String> keys=replaceStrMap.keySet(); for(String invalidChar:keys){ int index = -1; while((index=replaceStrBuilder.indexOf(invalidChar,index)) !=-1){ replaceStrBuilder.replace(index,index+invalidChar.length(),replaceStrMap.get(invalidChar)); } } return replaceStrBuilder.toString(); }