给定一个字符串:如下,如何对{X}进行字符串替换?
String str ="姓名:{1},班级:{2},年龄:{3}";
参考使用:
public String replace(CharSequence target, CharSequence replacement)
将与字面目标序列匹配的字符串的每个子字符串替换为指定的字面替换序列。 替换从字符串开始到结束,例如,在字符串“aaa”中用“b”替换“aa”将导致“ba”而不是“ab”。
参数
target - 要替换的char值序列
replacement - char值的替换顺序
结果
生成的字符串 【注意】
举例:
String str ="姓名:{1},班级:{2},年龄:{3}";
String str1 = str.replace("{1}","小明")
.replace("{2}","九年级(1)班")
.replace("{3}","九年级(1)班");
System.out.println(str);//姓名:{1},班级:{2},年龄:{3}
System.out.println(str1);//姓名:小明,班级:九年级(1)班,年龄:九年级(1)班
源码解析:
public String replace(CharSequence target, CharSequence replacement) {
return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(
this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
}
1.调用Pattern.compile方法,将给定的正则表达式编译【也就是Pattern.LITERAL:启用模式的文字解析。当指定此标志时,则指定的输入字符串该模式被视为文字字符序列。】为具有给定正则表达式的模式标志。
public static Pattern compile(String regex, int flags) {
return new Pattern(regex, flags);
}
2.matcher.创建一了一个根据1种指定模式匹配给定的输入的匹配器。
public Matcher matcher(CharSequence input) {
if (!compiled) {
synchronized(this) {
if (!compiled)
compile();
}
}
Matcher m = new Matcher(this, input);
return m;
}
3.调用匹配器的quoteReplacement方法:先生成一个StringBuilder对象,循环遍历replacement的每个字符,将其的\或者$的字符串都换成换成\。
public static String quoteReplacement(String s) {
if ((s.indexOf('\\') == -1) && (s.indexOf('$') == -1))
return s;
StringBuilder sb = new StringBuilder();
for (int i=0; i<s.length(); i++) {
char c = s.charAt(i);
if (c == '\\' || c == '$') {
sb.append('\\');
}
sb.append(c);
}
return sb.toString();
}
4.再调用Matcher方法的replaceAll方法替换每个匹配的子序列构造的字符串
public String replaceAll(String replacement) {
reset();
//查找匹配的输入序列的下一个子序列,若找到返回true
boolean result = find();
if (result) {
StringBuffer sb = new StringBuffer();
//遍历新字符串,替换每个匹配的子序列构造的字符串
do {
appendReplacement(sb, replacement);
result = find();
} while (result);
appendTail(sb);
return sb.toString();
}
return text.toString();
}

2058

被折叠的 条评论
为什么被折叠?



