首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否使用StringBuilder替换所有出现的字符串?

是否使用StringBuilder替换所有出现的字符串?
EN

Stack Overflow用户
提问于 2010-08-13 06:55:25
回答 13查看 123.9K关注 0票数 84

我是否遗漏了什么,或者StringBuilder缺少与普通string类相同的“用string B替换字符串A的所有匹配项”功能?StringBuilder的替换功能并不完全相同。有没有什么方法可以在不使用普通的String类生成多个String的情况下更有效地做到这一点呢?

EN

回答 13

Stack Overflow用户

发布于 2010-08-13 07:05:59

你可以写一个循环:

代码语言:javascript
运行
复制
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);
    }
}

请注意,在某些情况下,使用它可能会更快

,从后面工作。我怀疑如果你用一个短字符串替换一个长字符串,情况就是这样--所以当你开始的时候,任何替换字符串都有更少的需要复制的东西。无论如何,这应该给你一个起点。

票数 76
EN

Stack Overflow用户

发布于 2010-08-13 07:16:59

你可以使用

模式

/

匹配器

..。在Matcher javadocs中:

代码语言:javascript
运行
复制
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());
票数 37
EN

Stack Overflow用户

发布于 2015-10-23 15:15:30

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

代码语言:javascript
运行
复制
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();
    }
}
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3472663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档