java 字符串 替换,求解答

例如有这样一个字符串字符串:用户[$xx$]的名称[$xx$]原值为[$xx$]。。。
[$xx$]的个数1到5个不定,我需要替换$xx$,有什么方法可以替换指定的第几个$xx$,或者按顺序每次替换下一个$xx$也可以,求方法

/**
* 从指定位置替换字符,并将字符替换成cha
* @param str
* @param num
* @param cha
* @return
*/

public static String checkCode(String str,int num,StringBuffer cha){

    String[] shz = str.split("\\$xx\\$");
    StringBuffer newsha = new StringBuffer();
    for(int i=0;i<shz.length;i++){
        System.out.println(shz[i]);
        newsha.append(shz[i]);
        newsha.append("$xx$");
        if(i==num){
            newsha.append(cha);
        }
        System.out.println(i);
    }
    return newsha.toString();

}
    String sourceStr="用户[$xx$]的名称[$xx$]原值为[$xx$]";
    String result=sourceStr.replaceFirst("\\$xx\\$", "需要替换的字符串");
    System.out.print(result);
    不知满足要求不

若果上面的不满足你的需求,或许你的意思是每次都替换其中一个,其余的部分不改变,那么你的设计思路可以这样:
1 定义一个变量cursor=0,来记录每次需要替换的[$xx$]的下标,
2获取前缀preSub=subString(0,cursor),获取后缀postSub=subString(cursor+[$xx$].length);
3 拼接字符串:preSub+需要替换的字符串+postSub
4 cursor+=[$xx$].length),这样重复2,3步骤,就可以了

/**
*
* @param source 源字符串
* @param needrep 被替换的字符串
* @param rep 替换的字符串
* @param count 需要替换第几个
* @return 换过之后的字符串
*/
public static String replace(String source,String needRep,String rep,int count){
StringBuilder builder = new StringBuilder(source);
int j = 0;
for(int i=0;i<count;i++){
j=builder.indexOf(needRep,j);
if(j==-1){
return "";
}
j=j+1;
}
builder.replace(j-1, j-1+needRep.length(),rep);
return builder.toString();
}

    public String fun3(String str,String regex,Function<Integer,String>fn ) {
        StringBuilder sb = new StringBuilder(str);
        Pattern p = Pattern.compile(regex);
        int count = 0;
        Matcher m = p.matcher(sb.toString());
        while(m.find()) {
                int start = m.start();
                int end = m.end();
                sb.replace(m.start(), m.end(),fn.apply(count));
                count++;
                m = p.matcher(sb.toString());
        }
        return sb.toString();
    }
 String result = new NonBlocking().fun3("用户[$xx$]的名称[$xx$]原值为[$xx$]", "\\[\\$xx\\$\\]", (count)->{
            return "|第"+count+"次替换|";
        });
        System.out.println(result);

System.err.println(String.format("用户[%s]的名称[$%s$]原值为[%s]", "张三", "李四","王五"));
打印:用户[张三]的名称[$李四$]原值为[王五]

加个分组,
Pattern pattern = Pattern.compile("($xx$)?");//括号里是你的正则,?表示非贪婪,忘了这里需不需要了,要是不对去掉试试
Matcher m = p.matcher(strData);// 这里写你的数据源
while(m.find()) {//find一次,表示查找一次
m.group();//表示获取整个分组
m.group(1);//表示获取第一个分组
}
记次的话很简单,试着自己写一下,无非就是提一个变量,然后每次++就好了

String sourceStr="用户[$xx$]的名称[$xx$]原值为[$xx$]";
String result=sourceStr.replaceFirst("\$xx\$", "需要替换的字符串");
System.out.print(result);
不知满足要求不

String.format("%sxxx%sxxx%s",s1,s2,s3),用占位符就可以

我再说明下需求,$xx$的数量不定,传入一个字符串数组,数组的长度跟$xx$数量相同,位置相同。例如这样:
public void getConten(string ... iden){
string conten = "用户[$xx$]....";
.....
}
怎么做比较方便替换

按字符数量replace,看你的需求不需修改字符串的位置是固定的