我试图找到一种方法来替换字符串中找到的每个$#
,其中$
是文字字符'$'
,而#
是一个数字(使用1个或多个数字),并将$#
替换为#
位置数组中字符串的值。
以下是一些例子:
hello $2
Input2(数组)dave richard danny
结果:hello richard
hi $4
Input2(数组)morgan ryan matthew nikoli
结果:hi nikoli
当前代码:
public static String parse(String command, String[] args) {
String substituted = "";
substituted = command;
return substituted;
}
我正在寻找一个函数,我可以使用Array中的String替换表达式。
答案 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();
}
答案 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