Java字符串:用多个值替换字符串

4
我正在构建一个配置文件,将给定的字符串替换为多个变量。我很难解释清楚,也许最好向您展示我是什么意思:
以下方法将使用字符串:Hello ~ and welcome to ~!
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() 等方法。 这个列表不需要每次都被检查,因此可能仍需编译模式?

我做这个不仅是为了提高效率,也是为了学习,在正则表达式方面我的能力还有所欠缺!


你的代码有什么问题吗?你遇到了错误吗?还是只是想寻找更高效的方法? - knownasilya
1
就是这样,效率才是我追求的!虽然这个方法可行,但我在想..一定有更好、更干净、更可定制的方法来实现这个! - Thomas Nairn
1个回答

2

如果你想要提高效率,可以使用正则表达式实例化一个Matcher,然后使用find()方法查找出现的位置,并将每个出现的替换附加到一个StringBuffer中。

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

该死,我真的得学习正则表达式!:D 如果我想要一个匹配%p或其他随机变量以及~的匹配器,并且匹配和替换任何符合条件的内容,那么每个不同的匹配都实例化一个新的Matcher会有多费力呢?抱歉,您已经超出了我的期望!非常感谢! :) - Thomas Nairn
你可以为每个不同的Pattern实例化一个Matcher,并调用Matcher.reset(String)来初始化给定字符串的匹配器。在Matcher上调用reset比每次编译Pattern并从中实例化新的Matcher要少得多。 - Alex
太喜欢了!谢谢Alex,正是我要找的! - Thomas Nairn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接