2012-11-12 140 views
4

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

以下方法将与字符串一起使用:Hello〜并欢迎加入〜!

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; 
} 

这将是最快的方式与第一输入替换〜,然后移动到第二〜等等...

现在我还没有使用别人的代码的主要原因: 理想情况下,我想创建一个不同的可替换字符的列表,它将自动替换变量,所以在这个相同的代码中,我能够给它没有输入,但它会检查List以替换字符并执行一个方法如getYourName() 这个列表不需要每次检查,所以模式仍然可以编译?

我这样做是为了学习效率,我在缺乏能力时,正则表达式!

+0

出了什么问题,你有什么?你有错误吗?或者你只是在寻找更有效的方法? – knownasilya

+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[]中的事实。

Runnable的样品可以在这里找到:http://ideone.com/QfE03a

+0

该死的,我必须学习正则表达式! :D 征税如何为每个不同的匹配实例化一个新的匹配器,比方说,如果我想为%p或另一个随机变量匹配一个匹配器,然后匹配并用它替换任何东西? 对不起,您已经完成了超越!非常感谢! :) –

+0

你可以为每个不同的'Pattern'实例化一个'Matcher',并调用'Matcher.reset(String)'来初始化给定String的匹配器。在一个'Matcher'上调用重置比每次编译一个'Pattern'和实例化一个新的'Matcher'都要少。 – Alex

+0

喜欢它! Thankyou Alex,正是我在找的! –