例如有这样一个字符串字符串:用户[$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,看你的需求不需修改字符串的位置是固定的