Java变量替换

时间:2017-05-12 20:41:31

标签: java regex substitution

我试图找到一种方法来替换字符串中找到的每个$#,其中$是文字字符'$',而#是一个数字(使用1个或多个数字),并将$#替换为#位置数组中字符串的值。

以下是一些例子:

  1. Input1(String):hello $2 Input2(数组)dave richard danny结果:hello richard
  2. Input1(String):hi $4 Input2(数组)morgan ryan matthew nikoli结果:hi nikoli
  3. PS:我刚刚从C#转回Java,所以我忘了很多东西(除非它是基本的语法)

    当前代码:

    public static String parse(String command, String[] args) {
        String substituted = "";
        substituted = command;
    
        return substituted;
    }
    

    我正在寻找一个函数,我可以使用Array中的String替换表达式。

2 个答案:

答案 0 :(得分:2)

这通常仅使用String#replaceAll来解决,但由于您有自定义的动态替换字符串,因此您可以使用Matcher来有效且简洁地执行字符串替换。

public static String parse(String command, String... args) {
    StringBuffer sb = new StringBuffer();
    Matcher m = Pattern.compile("\\$(\\d+)").matcher(command);
    while (m.find()) {
        int num = Integer.parseInt(m.group(1));
        m.appendReplacement(sb, args[num - 1]);
    }
    m.appendTail(sb);
    return sb.toString();
}

Ideone Demo

答案 1 :(得分:0)

一个简单,低效的解决方案是迭代替换数组,寻找#1#2等:

String[] arr = new String[]{"one","two","three"};
String toReplace = "first $1 second $2 third $3";
for (int i =0; i<arr.length;i++){
    toReplace = toReplace.replaceAll("\\$"+(i+1), arr[i]);
}
System.out.println(toReplace);

输出:

first one second two third three

更有效的方法是在输入字符串本身上迭代一次。这是一个快速而肮脏的版本:

String[] arr = new String[]{"one","two","three"};
String toReplace = "first $1 second $2 third $3";
StringBuilder sb = new StringBuilder();
for (int i=0;i<toReplace.length();i++){
    if (toReplace.charAt(i)=='#' && i<toReplace.length()-1){
        int index = Character.digit(toReplace.charAt(i+1),10);
        if (index >0 && index<arr.length){
            sb.append(arr[index]);
            continue;
        }
    }
    sb.append(toReplace.charAt(i));
}
System.out.println(toReplace);

输出:

first one second two third three