【JAVA原理系列】Java String类中的三个替换方法replaceFirst、replaceAll和replace原理用法示例源码详解

这篇具有很好参考价值的文章主要介绍了【JAVA原理系列】Java String类中的三个替换方法replaceFirst、replaceAll和replace原理用法示例源码详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

String类中的三个替换方法replaceFirst、replaceAll和replace原理用法示例源码详解

原理

这里是三种字符串替换方法的原理:

  • replaceFirst() 方法的原理是通过编译给定的正则表达式,然后使用编译后的模式创建一个匹配器对象,将该匹配器应用于目标字符串,并使用给定的替换字符串替换第一个匹配的子字符串。

  • replaceAll() 方法的原理与 replaceFirst() 类似,也是通过编译给定的正则表达式,创建一个匹配器对象,将其应用于目标字符串,并使用给定的替换字符串替换所有匹配的子字符串。

  • replace() 方法的原理是将目标字符串中的所有指定字符序列替换为另一个字符序列。它不使用正则表达式进行匹配,而是直接在目标字符串中搜索并替换目标字符序列。

这些方法都依赖于 java.util.regex.Patternjava.util.regex.Matcher 类来进行正则表达式的解析和匹配。Pattern 类负责编译正则表达式,生成可供匹配使用的模式对象。Matcher 类负责应用模式匹配器到目标字符串上,并执行替换操作。

当调用这些方法时,会按照指定的规则进行匹配和替换,并返回替换后的结果字符串。这些方法提供了灵活和强大的字符串替换功能,可以根据需要进行各种类型的替换操作。

用法

  1. replaceFirst方法:

    • 该方法使用给定的正则表达式进行匹配,并将第一个匹配到的子字符串替换为指定的替换字符串。
    • 首先,通过Pattern.compile(regex)编译正则表达式,然后创建Matcher对象,并使用replaceFirst方法进行替换操作。
    • 最终返回替换后的结果字符串。
  2. replaceAll方法:

    • 该方法与replaceFirst方法类似,但不仅替换第一个匹配到的子字符串,而是替换所有匹配到的子字符串。
    • 同样,通过Pattern.compile(regex)编译正则表达式,创建Matcher对象,并使用replaceAll方法进行替换操作。
    • 返回替换后的结果字符串。
  3. replace方法:

    • 该方法用于替换字符串中的目标字符序列(target)为指定的替换字符序列(replacement)。
    • 首先,通过Pattern.compile(target.toString(), Pattern.LITERAL)编译目标字符序列,将其视为字面量进行匹配。
    • 创建Matcher对象,并使用replaceAll方法进行替换操作。在替换过程中,使用Matcher.quoteReplacement方法对替换字符序列进行转义处理,以避免特殊字符的影响。
    • 返回替换后的结果字符串。

这些替换方法提供了在字符串中进行模式匹配并替换的功能,可以根据需要选择合适的方法进行字符串的替换操作。

一般示例

public class StringReplaceExamples {
    public static void main(String[] args) {
        // 示例 1: 替换字符串中的单个字符
        String str1 = "Hello World";
        String replacedStr1 = str1.replace('o', 'O');
        System.out.println(replacedStr1); // 输出: HellO WOrld

        // 示例 2: 替换字符串中的子字符串
        String str2 = "Hello World";
        String replacedStr2 = str2.replace("World", "Universe");
        System.out.println(replacedStr2); // 输出: Hello Universe

        // 示例 3: 使用正则表达式替换字符串
        String str3 = "Hello, my name is John";
        String replacedStr3 = str3.replaceAll("John", "Alice");
        System.out.println(replacedStr3); // 输出: Hello, my name is Alice

        // 示例 4: 忽略大小写替换字符串
        String str4 = "Hello World";
        String replacedStr4 = str4.replaceAll("(?i)hello", "Hi");
        System.out.println(replacedStr4); // 输出: Hi World

        // 示例 5: 替换特殊字符
        String str5 = "Hello $ World";
        String replacedStr5 = str5.replace("$", "\\$");
        System.out.println(replacedStr5); // 输出: Hello \$ World

        // 示例 6: 替换单词边界处的字符串
        String str6 = "Hello Bob, welcome to Bob's World!";
        String replacedStr6 = str6.replaceAll("\\bBob\\b", "Alice");
        System.out.println(replacedStr6); // 输出: Hello Alice, welcome to Bob's World!

        // 示例 7: 删除字符串中的空格
        String str7 = "   Hello   World   ";
        String replacedStr7 = str7.replace(" ", "");
        System.out.println(replacedStr7); // 输出: HelloWorld

        // 示例 8: 使用引用替换匹配到的字符串
        String str8 = "Hello, my name is John Doe";
        String replacedStr8 = str8.replaceAll("John (Doe)", "Mr. $1");
        System.out.println(replacedStr8); // 输出: Hello, my name is Mr. Doe

        // 示例 9: 替换字符串中的数字
        String str9 = "Age: 25, Height: 180cm";
        String replacedStr9 = str9.replaceAll("\\d+", "*");
        System.out.println(replacedStr9); // 输出: Age: *, Height: *cm

        // 示例 10: 在匹配的子串前后添加特定字符
        String str10 = "apple, banana, cherry";
        String replacedStr10 = str10.replaceAll("(?<=, )", "-").replaceAll("(?=,)", "-");
        System.out.println(replacedStr10); // 输出: apple- banana- cherry
    }
}

高级用法

  1. 正则表达式替换:使用 replaceAll() 方法可以通过正则表达式来进行字符串替换。正则表达式可以匹配更复杂的模式,从而实现更精确的替换操作。

示例:

String str = "Hello, 123456!";
String replacedStr = str.replaceAll("\\d", "*");
System.out.println(replacedStr); // 输出: Hello, ****! 
  1. 引用替换:在替换字符串中,可以使用引用 $ 来引用正则表达式中匹配到的内容。这样可以在替换字符串中动态地插入匹配到的文本。

示例:

String str = "Hello, my name is John Doe";
String replacedStr = str.replaceAll("John (Doe)", "Mr. $1");
System.out.println(replacedStr); // 输出: Hello, my name is Mr. Doe
  1. 替换回调函数:Java 8 中引入了 replaceAll() 方法的重载版本,该方法接受一个 Lambda 表达式作为替换参数。可以通过回调函数动态地生成替换字符串。

示例:

String str = "Hello World";
String replacedStr = str.replaceAll("o", m -> m.group().toUpperCase());
System.out.println(replacedStr); // 输出: HellO WOrld
  1. 使用预定义字符集和断言:正则表达式中有一些预定义的字符集和断言,可以用于更精确的替换操作,如单词边界、行首和行尾等。

示例:

String str = "Hello, my name is John Doe";
String replacedStr = str.replaceAll("\\bJohn\\b", "Alice");
System.out.println(replacedStr); // 输出: Hello, my name is Alice Doe
  1. 替换特定位置的子串:使用正则表达式中的捕获组和反向引用,可以在替换字符串中插入原始字符串的特定部分。

示例:

String str = "Hello, my name is John Doe";
String replacedStr = str.replaceAll("name is (\\w+)", "name is $1 Smith");
System.out.println(replacedStr); // 输出: Hello, my name is John Smith
  1. 使用替换回调函数进行逻辑处理:通过编写自定义的替换逻辑,可以实现更复杂的字符串处理。这在需要根据匹配结果进行动态替换时非常有用。

示例:

String str = "Hello, today is 2022-02-15";
String replacedStr = str.replaceAll("\\d{4}-\\d{2}-\\d{2}", m -> {
    String date = m.group();
    int year = Integer.parseInt(date.substring(0, 4));
    int month = Integer.parseInt(date.substring(5, 7));
    int day = Integer.parseInt(date.substring(8, 10));
    String newDate = String.format("%02d-%02d-%02d", day, month, year);
    return newDate;
});
System.out.println(replacedStr); // 输出: Hello, today is 15-02-2022
  1. 字符串替换的性能优化:对于大量的字符串替换操作,可以考虑使用 StringBuilderStringBuffer 进行拼接,以提高性能。

示例:

String str = "Hello, World";
String replacedStr = str.replace("World", "Universe");
System.out.println(replacedStr); // 输出: Hello, Universe

// 使用 StringBuilder 进行拼接,提高性能
StringBuilder sb = new StringBuilder(str);
int index = sb.indexOf("World");
if (index != -1) {
    sb.replace(index, index + 5, "Universe");
}
replacedStr = sb.toString();
System.out.println(replacedStr); // 输出: Hello, Universe

这些高级用法可以帮助你更好地掌握字符串替换的技巧和方法。根据具体的需求,选择适当的方法和技术来实现复杂的字符串处理操作。

区别

这里是对字符串进行替换的三种方法的区别:

  • replaceFirst() 方法会替换第一个与给定正则表达式匹配的子字符串。例如,在字符串 “Hello World” 中,将第一个字母 “l” 替换为大写字母 “L”,结果为 “HeLlo World”。

  • replaceAll() 方法会替换所有与给定正则表达式匹配的子字符串。例如,在字符串 “Hello World” 中,将所有字母 “l” 替换为大写字母 “L”,结果为 “HeLLo WorLd”。

  • replace() 方法会替换指定的字符序列。它不使用正则表达式进行匹配,而是直接替换目标序列。例如,在字符串 “Hello World” 中,将所有字母 “o” 替换为大写字母 “O”,结果为 “HellO WOrld”。

请注意,replaceFirst()replaceAll() 方法的参数是正则表达式,而 replace() 方法的参数是普通的字符序列。在替换过程中,如果替换字符串中包含特殊字符(如反斜杠和美元符号),可能会导致意外的结果。可以使用 Matcher.quoteReplacement() 方法来取消这些字符的特殊意义。

如何选择

选择使用哪种替换方法取决于你的需求和情况:

  • 如果你只想替换第一个匹配的子字符串,可以使用 replaceFirst() 方法。
  • 如果你想替换所有匹配的子字符串,可以使用 replaceAll() 方法。
  • 如果你要替换的是固定的字符序列,而不是根据正则表达式进行匹配,可以使用 replace() 方法。

除此之外,还需要考虑以下因素:文章来源地址https://www.toymoban.com/news/detail-852854.html

  • 正则表达式的复杂度:如果你需要使用复杂的正则表达式进行匹配,那么应该选择使用 replaceFirst()replaceAll() 方法。
  • 性能考虑:在处理大量字符串时,replace() 方法通常比正则表达式更高效。因为它不涉及正则表达式的解析和匹配过程。
  • 特殊字符的处理:如果你的替换字符串中包含特殊字符(如反斜杠和美元符号),可能会导致意外的结果。在这种情况下,你可以使用 Matcher.quoteReplacement() 方法来取消这些字符的特殊意义。

中文源码

/**
 * 使用给定的正则表达式替换此字符串中第一个与之匹配的子字符串。
 *
 * 调用此方法的形式 <i>str</i>.replaceFirst(<i>regex</i>, <i>repl</i>) 生成的结果与表达式完全相同:
 *
 * Pattern.compile(<i>regex</i>).matcher(<i>str</i>).replaceFirst(<i>repl</i>)
 *
 * 注意,替换字符串中的反斜杠 (\) 和美元符号 ($) 可能导致结果与将其视为文字替换字符串时不同;
 * 参见 Matcher.replaceFirst。如果需要,请使用 Matcher.quoteReplacement 来取消这些字符的特殊意义。
 *
 * @param regex       要匹配的正则表达式
 * @param replacement 要替换第一个匹配项的字符串
 * @return 结果字符串
 * @throws PatternSyntaxException 如果正则表达式的语法无效
 * @see java.util.regex.Pattern
 * @since 1.4
 * @spec JSR-51
 */
public String replaceFirst(String regex, String replacement) {
    return Pattern.compile(regex).matcher(this).replaceFirst(replacement);
}

/**
 * 使用给定的正则表达式替换此字符串中与之匹配的每个子字符串。
 *
 * 调用此方法的形式 <i>str</i>.replaceAll(<i>regex</i>, <i>repl</i>) 生成的结果与表达式完全相同:
 *
 * Pattern.compile(<i>regex</i>).matcher(<i>str</i>).replaceAll(<i>repl</i>)
 *
 * 注意,替换字符串中的反斜杠 (\) 和美元符号 ($) 可能导致结果与将其视为文字替换字符串时不同;
 * 参见 Matcher.replaceAll。如果需要,请使用 Matcher.quoteReplacement 来取消这些字符的特殊意义。
 *
 * @param regex       要匹配的正则表达式
 * @param replacement 要替换每个匹配项的字符串
 * @return 结果字符串
 * @throws PatternSyntaxException 如果正则表达式的语法无效
 * @see java.util.regex.Pattern
 * @since 1.4
 * @spec JSR-51
 */
public String replaceAll(String regex, String replacement) {
    return Pattern.compile(regex).matcher(this).replaceAll(replacement);
}

/**
 * 使用指定的字面目标序列替换此字符串中与之匹配的每个子字符串。替换从字符串的开头到结尾进行,
 * 例如,在字符串 "aaa" 中用 "b" 替换 "aa" 将导致 "ba" 而不是 "ab"。
 *
 * @param target      要替换的字符序列
 * @param replacement 替换的字符序列
 * @return 结果字符串
 * @since 1.5
 */
public String replace(CharSequence target, CharSequence replacement) {
    return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(
            this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
}

到了这里,关于【JAVA原理系列】Java String类中的三个替换方法replaceFirst、replaceAll和replace原理用法示例源码详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java中String字符串替换3种方法详解

    replace() 方法用于将目标字符串中的指定字符(串)替换成新的字符(串) 字符串.replace(String oldChar, String newChar) replaceFirst() 方法用于将目标字符串中匹配某正则表达式的第一个子字符串替换成新的字符串 字符串.replaceFirst(String regex, String replacement) replaceAll() 方法用于将目标字

    2024年02月11日
    浏览(42)
  • 【Java基础教程】(三十八)常用类库篇 · 第八讲:数组操作类——解析Arrays类中的全部操作方法,解锁Java数组操作技巧~

    前言:在学习本文之前,应该先学习并清楚了解Java基础部分的数组相关的概念和知识。 若还不具备学习条件,请先前往学习数组部分的基础知识: 《【Java基础教程】(八)面向对象篇 · 第二讲:Java 数组全面解析——动态与静态初始化、二维数组、方法参数传递、排序与转

    2024年02月15日
    浏览(47)
  • JAVA深化篇_29—— 线程使用之线程联合以及Thread类中的其他常用方法【附有详细说明及代码案例】

    线程联合 当前线程邀请调用方法的线程优先执行,在调用方法的线程执行结束之前,当前线程不能再次执行。线程A在运行期间,可以调用线程B的join()方法,让线程B和线程A联合。这样,线程A就必须等待线程B执行完毕后,才能继续执行。 join方法的使用 join()方法就是指调用该

    2024年02月05日
    浏览(35)
  • Java中的字符串替换

    在Java中,String 类提供了 3 种字符串替换方法,分别是 replace()、replaceFirst() 和 replaceAll(),下面我们就来详细看一下三种的用法!     下面这套 Java300集 视频专门为零基础而制,适合准备入行Java开发的零基础,视频中穿插多个实战项目。每一个知识点都讲解的通俗易懂,由

    2024年02月11日
    浏览(31)
  • C++:替换string中的字符

    1.按照位置进行替换 string的成员函数replace可以满足这种需求,其变体有很多种,请参考官方文档,以下列举常用的两种: 运行程序输出: hi world hello world 2.替换指定的字符 如果需要将string中所有指定的字符全部替换,如果使用成员函数replace比较的麻烦,这时可以使用STL的

    2024年02月13日
    浏览(38)
  • Java中的字符串String

    目录 一、常用方法 1、字符串构造 2、String对象的比较 (1)、equals方法 (2)、compareTo方法 (3)、compareToIgnoreCase方法(忽略大小写进行比较) 3、字符串查找 4、转化 (1)数值和字符串转化 ​编辑 (2)大小写转换 (3)字符串转数组 (4)格式化 5、字符串替换 6、字符串

    2024年02月05日
    浏览(51)
  • Java中的String字符串练习

    目录 Java中的String字符串练习 01-用户登录 02-遍历字符串并统计字符个数 03-字符串拼接 04-字符串反转 注意点 05-金额转化(简单) 代码解释: 06-手机号屏蔽 07-身份证号码查看 易错点: 08-敏感词替换 注意点 toCharArray() 是Java中的一个方法,它用于将字符串转换为字符数组。 方法签

    2024年03月28日
    浏览(40)
  • Java中的String、StringBuffer和StringBuilder

    在 Java 中,字符串是最常用的数据类型之一。 Java 中有三种处理字符串的方式:String、StringBuffer 和 StringBuilder。它们都被设计为处理字符串操作,但是它们之间有所不同。本篇博客将会介绍 String、StringBuffer 和 StringBuilder 的区别以及如何在 Java 中使用这些类型。 在 Java 中,

    2024年02月02日
    浏览(25)
  • 一起来了解一下Java中的String类吧!!!

    在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提 供的字符串系列函数完成大部分操作,但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想,而字 符串应用又非常广泛,因此Java语言专门提供了

    2024年02月16日
    浏览(28)
  • 【JavaSE】Java基础语法(三十七):Java 中的 String 类(源码级别)

    String 表示 字符串类型,属于 引用数据类型 。Java 中 String 是 不可变 的。 在 Java 当中 双引号 括起来的字符串,是直接存储在“方法区”的“字符串常量池”当中的。 源码: 源码: 源码: 源码: 源码: 源码: 源码: 源码: https://blog.csdn.net/qq_44715943/article/details/116308837

    2024年02月06日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包