小编典典
public class StrSubstitutor {
private Map map;
private static final Pattern p = Pattern.compile("\\$\\{(.+?)\\}");
public StrSubstitutor(Map 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映射到Golden
Retriever,则apache版本将映射${animal}到Golden
Retriever。如我所说,您应该尽可能使用库。仅当您有不允许您使用库的特殊约束时,才可以使用上述解决方案。
2020-11-01