首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

【Java每日一题】String.replaceAll 陷阱:正则特殊字符 $ 导致替换异常

     編輯:Java 綜合教學

题目代码

public class Ques0103 {
    public static void main(String[] args){
        System.out.println(delete("你好", "你").equals("好"));
        System.out.println(delete("$好", "$").equals("好"));
    }
    public static String delete(String string, String sub){
        return string.replaceAll(sub, "");
    }
}

问题

请问主程序输出结果是什么?

答案与解析

输出结果

true
false

原因分析

  1. 第一行 `delete("你好", "你")`:
    • "你" 非正则特殊字符,按字面匹配。
    • 替换后为 "好",equals("好") 返回 true。
  2. 第二行 `delete("$好", "$")`:
    • "$" 在正则表达式中是**行尾锚点**,匹配字符串结束位置(空宽度断言),**不匹配字面字符 '$'**。
    • replaceAll("$", "") 相当于在字符串末尾插入空串,**原字符串内容不变**,仍为 "$好"。
    • "$好".equals("好") 返回 false。

核心知识点

String.replaceAll(String regex, String replacement) **第一个参数是正则表达式**!

若需按字面字符串替换,必须转义特殊字符:

  • 手动转义:string.replaceAll("\\$", "")(Java 字符串中需双重转义)。
  • 使用 Pattern.quote("):string.replaceAll(Pattern.quote("$"), "")。
  • 或改用 string.replace(CharSequence target, CharSequence replacement)(**不支持正则**,直接字面替换,性能更好)。

修正后的 delete 方法

public static String delete(String string, String sub){
    // 方式一:使用 replace (推荐,简单高效)
    return string.replace(sub, "");
    
    // 方式二:若必须用 replaceAll,需转义
    // return string.replaceAll(Pattern.quote(sub), "");
}

扩展:正则常见特殊字符速查

字符正则含义字面匹配写法
.任意单字符\\.
$行尾\\$
^行首\\^
* + ?量词\\* \\+ \\?
[ ] { } ( ) | \\分组/字符类/或/转义均需 \\ 转义

总结

**切记:`replaceAll` 吃正则,`replace` 吃字面量。** 日常简单替换首选 replace,避坑又高效。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved