使用StringBuilder替换所有出现的String?

gar*_*h0p 78 java

我错过了什么,或者StringBuilder是否缺少与普通String类相同的"将所有出现的字符串A替换为字符串B"的函数?StringBuilder替换功能并不完全相同.有没有任何方法可以更有效地使用普通的String类生成多个字符串?

Jon*_*eet 74

好吧,你可以写一个循环:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,在某些情况下lastIndexOf,从后面开始使用可能会更快.我怀疑如果你用一个短字符串替换长字符串就是这种情况 - 所以当你开始时,任何替换都要少复制.无论如何,这应该给你一个起点.

  • @AmitabhaRoy:这将取代问题中所述的*一次*出现,而不是*所有*出现。 (3认同)

Ron*_*ero 34

你可以使用Pattern/Matcher.来自Matcher 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());
Run Code Online (Sandbox Code Playgroud)

  • 这与Matcher#replaceAll()几乎相同. (5认同)

Alf*_*rio 12

查看String类的replaceAll方法的JavaDoc :

将给定替换的给定正则表达式匹配的此字符串的每个子字符串替换.调用str.replaceAll(regex,repl)形式的此方法会产生与表达式完全相同的结果

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

如您所见,您可以使用PatternMatcher来执行此操作.


小智 12

@Adam:我认为在你的代码片段中你应该跟踪m.find()的起始位置,因为字符串替换可能会在最后一个字符匹配后更改偏移量.

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();
    }
}
Run Code Online (Sandbox Code Playgroud)


Pau*_*gas 11

这个类org.apache.commons.lang3.text.StrBuilder的Apache Commons Lang中允许更换:

public StrBuilder replaceAll(String searchStr, String replaceStr)
Run Code Online (Sandbox Code Playgroud)

*这不会收到正则表达式,而是一个简单的字符串.

  • 现在已弃用。 (2认同)

小智 6

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

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

  • ReplaceAll 方法返回字符串。所以它会在String池中生成一个实例。当需要进行多种不同的替换时,这不是一种有效的方法。 (5认同)