我需要以最有效的方式替换字符串中的许多不同的子串。除了使用string.replace替换每个字段之外,还有没有其他方法?
发布于 2009-08-25 08:55:44
如果您正在操作的字符串非常长,或者您正在对许多字符串进行操作,那么使用java.util.regex.Matcher可能是值得的(这需要预先花费时间进行编译,因此如果您的输入非常小或者搜索模式频繁更改,则效率不高)。
下面是一个完整的示例,基于从地图中获取的标记列表。(使用来自Apache Commons Lang的StringUtils )。
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());
一旦编译了正则表达式,扫描输入字符串通常非常快(尽管如果您的正则表达式很复杂或涉及回溯,那么您仍然需要进行基准测试才能确认这一点!)
发布于 2009-08-25 08:02:15
StringBuilder
将更有效地执行替换,因为它的字符数组缓冲区可以指定为所需的长度。StringBuilder
的设计不仅仅是为了追加!
当然,真正的问题是,这是不是优化得太过分了?JVM非常擅长处理多个对象的创建和随后的垃圾回收,就像所有优化问题一样,我的第一个问题是您是否测量过这一点并确定它是一个问题。
发布于 2010-12-30 16:16:33
请检查以下内容:
String.format(str,STR[])
例如:
String.format( "Put your %s where your %s is", "money", "mouth" );
https://stackoverflow.com/questions/1326682
复制相似问题