Chr*_*s R 2 java string algorithm optimization
给定一个包含替换键的字符串,如何使用Java最有效地用运行时值替换这些键?我需要经常,快速地,以及相当长的字符串(例如,平均1-2kb).键的形式是我的选择,因为我也在这里提供模板.
这是一个例子(请不要挂断它是XML;我想这样做,如果可能的话,比使用XSL或DOM操作便宜).我想@[^@]*?@
用bean属性,true Property
属性和一些其他来源中的属性值替换此中的所有模式.这里的关键是快速.有任何想法吗?
<?xml version="1.0" encoding="utf-8"?>
<envelope version="2.3">
<delivery_instructions>
<delivery_channel>
<channel_type>@CHANNEL_TYPE@</channel_type>
</delivery_channel>
<delivery_envelope>
<chan_delivery_envelope>
<queue_name>@ADDRESS@</queue_name>
</chan_delivery_envelope>
</delivery_envelope>
</delivery_instructions>
<composition_instructions>
<mime_part content_type="application/xml">
<content><external_uri>@URI@</external_uri></content>
</mime_part>
</composition_instructions>
</envelope>
Run Code Online (Sandbox Code Playgroud)
天真的实现是使用,String.replaceAll()
但我不禁认为这不太理想.如果我可以避免添加新的第三方依赖项,那就更好了.
Matcher中的appendReplacement方法看起来可能有用,虽然我不能保证它的速度.
这是来自Javadoc的示例代码:
Pattern p = Pattern.compile("cat");
Matcher m = p.matcher("one cat two cats in the yard");
StringBuffer sb = new StringBuffer();
while (m.find()) {
m.appendReplacement(sb, "dog");
}
m.appendTail(sb);
System.out.println(sb.toString());
Run Code Online (Sandbox Code Playgroud)
编辑:如果这很复杂,你可能很容易实现自己的状态机.你几乎要做appendReplacement已经在做的事情,尽管专门的实现可能会更快.