Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java字符串:用多个值替换字符串_Java_Regex_Replace - Fatal编程技术网

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

Java字符串:用多个值替换字符串,java,regex,replace,Java,Regex,Replace,我目前正在构建一个配置文件,该文件将用多个变量替换给定字符串,我很难解释它,所以最好向您展示我的意思: 以下方法将用于字符串:Hello~和welcome to~ private static String REPLACE_CHAR = "~"; public static String parse(String key, String... inputs) { int cache = matchCache.get(key, -1); String value = custom

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

以下方法将用于字符串:Hello~和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;
}
private static String REPLACE_CHAR=“~”;
公共静态字符串解析(字符串键、字符串…输入){
int cache=matchCache.get(键-1);
字符串值=customConfig.getString(键);
如果(缓存==-1){
cache=StringUtils.countMatches(值,替换字符);
matchCache.put(key,cache);
}
for(int i=0;i
用第一个输入替换~然后移动到第二个~的最快方法是什么,依此类推

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


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

如果您希望提高效率,您可以使用正则表达式实例化一个
匹配器
,然后使用
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[]
的长度是否等于它,您仍然可以缓存找到的
~
的数量

上面的示例忽略了一个事实,即
输入[]
中存储了正确数量的条目


可以在此处找到可运行的示例:

您的产品有什么问题?你有错误吗?或者你只是在寻找一种更有效的方法?就是这样,效率是我追求的!见鬼,这真管用,我只是看着它在想自己。。我知道有一种更好、更干净、更可定制的方法可以做到这一点!该死,我得学正则表达式D taxing是如何为每个不同的匹配实例化一个新的匹配器的,比如说,如果我想为%p或另一个随机变量以及~创建一个匹配器,然后匹配并替换任何匹配器?对不起,你已经做得很好了!非常感谢!:)您可以为每个不同的
模式实例化一个
Matcher
,并调用
Matcher.reset(String)
来初始化给定字符串的匹配器。在
匹配器上调用reset
比编译
模式
并每次从中实例化一个新的
匹配器
要省力。热爱它!谢谢你,亚历克斯,这正是我想要的!