在String中替换多个字符串

时间:2015-03-30 09:11:40

标签: java string substitution

我知道有很多问题和答案与类似问题相关,但我无法找到问题的答案。这是我的代码的一小部分:

    private String substitute(String text) {
      List<Macro> macros = getMacros();

      for (Macro macro : macros) {
        text = StringUtils.replace(text, macro.getKey(), macro.getValue());
      }
      return text;
    }  
  1. 这是替换文本字符串中的多个宏变量的好方法吗?这会在每个循环上创建一个新的String对象,所以我想知道是否有更好的方法来做到这一点。理想情况下,我会使用Apache Commons StrSubstitutor类,但由于令牌/宏的格式(不同的格式而不是固定的前缀/后缀),我不能这样做。由于性能问题,我也不想使用正则表达式。
  2. 根据工作中的一些编码规则,我需要将参数标记为final。我想知道这在这里确实是不错的做法。我知道字符串是不可变的,我知道每当我调用StringUtils.replace()时,它都会返回一个新的String对象。但我想知道这里的String参数是否应该按建议标记为final,并且在方法中执行如下操作:

    String result = text;
    for (Macro macro : macros) {
      result = StringUtils.replace(result, macro.getKey(), macro.getValue());
    }
    

    我不喜欢这样。

  3. 任何帮助将不胜感激。感谢。

3 个答案:

答案 0 :(得分:1)

您可以使用 apache velocity 将带有键的字符串替换为带有值的等效字符串。

答案 1 :(得分:0)

如果您对性能有一些担忧,可以使用StringBuilder,它允许您将文本参数声明为final:

private String substitute(final String text) {
    List<Macro> macros = getMacros();
    StringBuilder stringBuilder=new StringBuilder(text);
    for(Macro macro: macros) {
        int index=stringBuilder.indexOf(macro.getKey());
        if (index!=-1) {
            stringBuilder.replace(index, index+macro.getKey().length(), macro.getValue());
        }
    }
    return stringBuilder.toString();
}

答案 2 :(得分:0)

您的担忧似乎有效。字符串是不可变的,因此它会创建多个对象。您应该使用StringBuilder还是StringBuffer。

我为你写了一个样本。从这里构建

private static String substitute(String text) {
        List<Macro> macros = getMacros();
        StringBuffer st = new StringBuffer(text);

        for (Macro macro : macros) {
            int start = st.indexOf(macro.getKey());
            if (start != -1) {
                st.replace(start, start + macro.getKey().length(), macro.getValue());
            }
        }
        return st.toString();
    }

干杯!!