我需要一个快速密钥替换算法的Java

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()但我不禁认为这不太理想.如果我可以避免添加新的第三方依赖项,那就更好了.

Mic*_*ers 6

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已经在做的事情,尽管专门的实现可能会更快.