4

我目前正在构建一个配置文件,它将用多个变量替换给定的字符串,我很难解释它,所以也许最好向你展示我的意思:

以下方法将与字符串一起使用:您好~欢迎来到~!

private static String REPLACE_CHAR = "~";

public static String parse(String key, String... inputs) {
    int cache = matchCache.get(key, -1);
    String value = customConfig.getString(key);
    if (cache == -1) {
        cache = StringUtils.countMatches(value, REPLACE_CHAR);
        matchCache.put(key, cache);
    }
    for (int i = 0; i < cache; i++) {
        value = value.replaceFirst(REPLACE_CHAR, inputs[i]);
    }
    return value;
}

用第一个输入替换〜的最快方法是什么,然后移至第二个〜等等......

现在我没有使用其他人的代码的主要原因:理想情况下,我想创建一个不同可替换字符的列表,这将反过来自动替换变量,所以在同一个代码中我可以不给它输入但是它将检查列表中的可替换字符并执行诸如 getYourName() 之类的方法。此列表不需要每次都检查,因此仍然可以编译模式?

我这样做是为了提高效率,我在正则表达式方面缺乏能力!

4

1 回答 1

2

如果您正在寻找效率,您可以Matcher使用正则表达式实例化 a,然后使用该find()方法查找出现,将每个出现的替换附加到 aStringBuffer中。

private Matcher matcher = Pattern.compile("([~])").matcher("");

public String parse(String key, String... inputs) {
    String value = customConfig.getString(key);
    matcher.reset(value);
    StringBuffer sb = new StringBuffer();
    int i = 0;
    while (matcher.find()) {
      String text = matcher.group(1);
      matcher.appendReplacement(sb, inputs[i++]);
    }
    matcher.appendTail(sb);
    return sb.toString();
}

System.out.println(parse("foo", "T F C", "James Bond"));
// prints "Hello T F C, my name is James Bond" 
// if customConfig.getString("foo") returns "Hello ~, my name is ~"

这样,您可以避免在涉及的每个循环期间从字符串开头查找String.replaceFirst~但是,如果您想验证的长度input[]确实等于它,您仍然可以缓存找到的数量。

上面的示例确实忽略了正确数量的条目存储在inputs[].

可运行的示例可以在这里找到:http: //ideone.com/QfE03a

于 2012-11-12T22:28:13.860 回答