首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java一次替换字符串中的多个不同的子字符串(或以最有效的方式)

Java一次替换字符串中的多个不同的子字符串(或以最有效的方式)
EN

Stack Overflow用户
提问于 2009-08-25 07:52:35
回答 8查看 120.9K关注 0票数 108

我需要以最有效的方式替换字符串中的许多不同的子串。除了使用string.replace替换每个字段之外,还有没有其他方法?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-08-25 08:55:44

如果您正在操作的字符串非常长,或者您正在对许多字符串进行操作,那么使用java.util.regex.Matcher可能是值得的(这需要预先花费时间进行编译,因此如果您的输入非常小或者搜索模式频繁更改,则效率不高)。

下面是一个完整的示例,基于从地图中获取的标记列表。(使用来自Apache Commons Lang的StringUtils )。

代码语言:javascript
复制
Map<String,String> tokens = new HashMap<String,String>();
tokens.put("cat", "Garfield");
tokens.put("beverage", "coffee");

String template = "%cat% really needs some %beverage%.";

// Create pattern of the format "%(cat|beverage)%"
String patternString = "%(" + StringUtils.join(tokens.keySet(), "|") + ")%";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(template);

StringBuffer sb = new StringBuffer();
while(matcher.find()) {
    matcher.appendReplacement(sb, tokens.get(matcher.group(1)));
}
matcher.appendTail(sb);

System.out.println(sb.toString());

一旦编译了正则表达式,扫描输入字符串通常非常快(尽管如果您的正则表达式很复杂或涉及回溯,那么您仍然需要进行基准测试才能确认这一点!)

票数 108
EN

Stack Overflow用户

发布于 2009-08-25 08:02:15

StringBuilder将更有效地执行替换,因为它的字符数组缓冲区可以指定为所需的长度。StringBuilder的设计不仅仅是为了追加!

当然,真正的问题是,这是不是优化得太过分了?JVM非常擅长处理多个对象的创建和随后的垃圾回收,就像所有优化问题一样,我的第一个问题是您是否测量过这一点并确定它是一个问题。

票数 4
EN

Stack Overflow用户

发布于 2010-12-30 16:16:33

请检查以下内容:

代码语言:javascript
复制
String.format(str,STR[])

例如:

代码语言:javascript
复制
String.format( "Put your %s where your %s is", "money", "mouth" );
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1326682

复制
相关文章

相似问题

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