一尘不染

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

java

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


阅读 829

收藏
2020-03-10

共1个答案

一尘不染

如果你要处理的字符串很长,或者你要处理许多字符串,那么使用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());

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

2020-03-10