Java8字符串替换方法梳理

举报
maijun 发表于 2020/12/24 10:58:25 2020/12/24
【摘要】 简单介绍Java字符串替换的几个API

我们在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 class StringReplaceTest {
    public static void main(String[] args) {
        String str = "12\\d12\\d";
        System.out.println(str.replace('1', '3')); // 32\d32\d
        System.out.println(str.replace("\\d", "34")); // 12341234
        System.out.println(str.replaceAll("\\d", "34")); // 3434\d3434\d
        System.out.println(str.replaceFirst("\\d", "34")); // 342\d12\d
    }
}

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。