java $字符串替换_Java8字符串替换方法梳理

我们在Java开发中,经常会应用到Java String中字符串替换的功能,但是,Java中字符串的替换,有多个API,而且和其他语言中的用法有所不同,发现之前的理解有偏差,在这里进行一下梳理。

在Java中,主要有四个字符串替换的API,主要有:

// 按字符替换,原来的字符替换为新的字符(会将所有的oldChar都替换为newChar)

String replace(char oldChar, char newChar)

// 按字符序列(一般是字符串)替换,会将所有的原来的字符序列替换为新的字符序列

String replace(CharSequence target, CharSequence replacement)

// 按照正则替换,所有正则表达式可以匹配上的,都替换为新的字符串

String replaceAll(String regex, String replacement)

// 按照正则替换,替换第一个匹配上的

String replaceFirst(String regex, String replacement)

1. API源码分析

下面,我们将针对这四个API进行简单介绍,下面先贴一下这四个API的源码:

/**

* String replace(char oldChar, char newChar)

*/

public String replace(char oldChar, char newChar) {

if (oldChar != newChar) {

int len = value.length;

int i = -1;

char[] val = value; /* avoid getfield opcode */

while (++i < len) {

if (val[i] == oldChar) {

break;

}

}

if (i < len) {

// 创建一个新的字符数组,内容为当前字符串字符序列的内容

char buf[] = new char[len];

for (int j = 0; j < i; j++) {

buf[j] = val[j];

}

// 逐字符进行匹配,如果该字符是oldChar,则替换为newChar

// 这种字符替换的方式非常简单,就是逐字符替换,没有什么特殊

while (i < len) {

char c = val[i];

buf[i] = (c == oldChar) ? newChar : c;

i++;

}

return new String(buf, true);

}

}

return this;

}

/**

* String replace(CharSequence target, CharSequence replacement)

*/

public String replace(CharSequence target, CharSequence replacement) {

// 首先以Pattern.LITERAL模式(模式中的元字符和转义字符将按照普通字符解析),匹配所有的能匹配到的子字符串

// 然后将所有可以匹配到的子字符串给替换成希望替换的新的字符串

// 这里,Matcher.quoteReplacement() 可以处理替换目标中的特殊字符,例如 $ 等,使替换匹配原始格式

// 当然,从形参名上也可以看出来一点儿信息,target,就是替换的目标,机械替换

return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(

this).replaceAll(Matcher.quoteReplacement(replacement.toString()));

}

/**

* String replaceAll(String regex, String replacement)

*/

public String replaceAll(String regex, String replacement) {

// 以正则匹配的形式,先匹配到所有可以匹配到的子字符串

// 然后将所有可匹配到的子字符串替换成新字符串的内容

return Pattern.compile(regex).matcher(this).replaceAll(replacement);

}

/**

* String replaceFirst(String regex, String replacement)

*/

public String replaceFirst(String regex, String replacement) {

// 以正则匹配的形式,先匹配到所有可以匹配到的子字符串

// 然后将所有可匹配到的第一个子字符串替换成新字符串的内容

return Pattern.compile(regex).matcher(this).replaceFirst(replacement);

}

2. 举例分析

如下面的代码:

public classStringReplaceTest {

public static voidmain(String[] args) {

String str = "12\\d12\\d";System.out.println(str.replace('1','3'));// 32\d32\dSystem.out.println(str.replace("\\d","34"));// 12341234System.out.println(str.replaceAll("\\d","34"));// 3434\d3434\dSystem.out.println(str.replaceFirst("\\d","34"));// 342\d12\d}

}

上面 \\d 就是 \d,是做转义用,非常简单,第4行,简单字符替换,1替换为3,第5行,简单字符串替换,第6行,正则替换,所有匹配上的数字都替换为"34",第7行,只替换第一个匹配上的数字。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值