如果性能不是优先事项,则
可以使用类的
appendReplacement方法
Matcher:
public class StrSubstitutor { private Map<String, String> map; private static final Pattern p = Pattern.compile("\$\{(.+?)\}"); public StrSubstitutor(Map<String, String> map) { this.map = map; } public String replace(String str) { Matcher m = p.matcher(str); StringBuilder sb = new StringBuilder(); while (m.find()) { String var = m.group(1); String replacement = map.get(var); m.appendReplacement(sb, replacement); } m.appendTail(sb); return sb.toString(); }}一个更高性能但更丑陋的版本,只是为了好玩:)
public String replace(String str) { StringBuilder sb = new StringBuilder(); char[] strArray = str.toCharArray(); int i = 0; while (i < strArray.length - 1) { if (strArray[i] == '$' && strArray[i + 1] == '{') { i = i + 2; int begin = i; while (strArray[i] != '}') ++i; sb.append(map.get(str.substring(begin, i++))); } else { sb.append(strArray[i]); ++i; } } if (i < strArray.length) sb.append(strArray[i]); return sb.toString(); }根据我的测试,它大约是regex版本的2倍,比apache
commons版本的3倍快。因此,普通的regex东西实际上比apache版本更优化。通常通常不值得。只是为了好玩,让我知道您是否可以使其更优化。
编辑
:正如@kmek指出的,有一个警告。Apache版本将过渡解决。例如,如果
${animal}映射到${dog}和dog映射到
GoldenRetriever,则apache版本将映射
${animal}到GoldenRetriever。如我所说,您应该尽可能使用库。仅当您有不允许您使用库的特殊约束时,才可以使用上述解决方案。



