java中字符替换_Java中的字符替换
(前记:纯属基础知识总结)
在JDK的String类中,提供了replace、relaceAll、replaceFirst三个⽅法⽤于字符替换,其中replaceFirst通过字⾯理解就是替换匹配的第⼀个字符;⽽replace、relaceAll都是全部替换的意思
那这三个有什么本质上的区别呢??
下⾯看⼀个例⼦,需要将字符串"orange.ato"中的所有"."替换为"|",
package com.yf.str;
public class ReplaceStr {
public static void main(String[] args) {
String str="orange.ato";
System.out.place(".", "|"));
System.out.placeAll(".", "|"));
System.out.placeFirst(".", "|"));
}
}输出结果如下
orange|peach|banana|tomato
||||||||||||||||||||||||||
|range.ato从结果可以看出,第⼀个是我们想要的结果,⽽后⾯两个都不是我们预期的答案,这是为什么呢??
看看String类中源码实现:
⾸先看看replace的实现(已经通过注释解答逻辑)
public String replace(char oldChar, char newChar) {
if (oldChar != newChar) {
int len = count;
int i = -1;
char[] val = value; /* avoid getfield opcode */
int off = offset; /* avoid getfield opcode */
//到第⼀个需要替换字符的位置
while (++i < len) {
if (val[off + i] == oldChar) {
break;
}
}
//将第⼀个需要替换的字符前⾯部分拷贝出来
if (i < len) {
char buf[] = new char[len];
for (int j = 0 ; j < i ; j++) {
buf[j] = val[off+j];
}
//从第⼀个需要替换的字符开始,替换后⾯所有的字符
while (i < len) {
char c = val[off + i];
buf[i] = (c == oldChar) ? newChar : c;
i++;
}
//返回新的字符串
return new String(0, len, buf);
}
}
return this;
}
很明显,replace直接就是要字符匹配,相当于匹配ASSIC码,它遍历字符数组中的每⼀个元素,判断字符是否与'.'相等,如果相等则替换,所以它能将字符串⾥⾯所有的"."全部替换为"|"。
再看看replaceAll的逻辑
public String replaceAll(String regex, String replacement) {
//解析正则表达式,然后替换匹配的正则
return Patternpile(regex).matcher(this).replaceAll(replacement);java replace方法
}
replaceAll与replace本质区别在于其是⽤正则的⽅式匹配,它传⼊的是⼀个正则表达式,⽽在正则表达式中"."表⽰的任意字符,所以上⾯调⽤
replaceAll后会将所有字符都替换为"|"。那么很容易推测出replaceFirst也是通过正则匹配,⽽实际上它也确实这么做的
public String replaceFirst(String regex, String replacement) {
return Patternpile(regex).matcher(this).replaceFirst(replacement);
}那么上⾯的代码的正确⽅式是将replaceAll、replaceFirst的输⼊转义,转为真正的"."
String str="orange.ato";
System.out.place(".", "|"));
System.out.placeAll("\\.", "|"));
System.out.placeFirst("\\.", "|"));输出结果如下:
orange|peach|banana|tomato
orange|peach|banana|tomato
orange|ato
需要注意⼀下String.split(String regex)、
String.matches(String regex)等都是通过正则匹配来做判断的(只有replace通过判断字符是否相等)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。