Java 字符串替换

news/2025/12/10 9:25:44/文章来源:https://www.cnblogs.com/codingkf/p/19329366

Java 字符串替换

字符串替换是 Java 开发中最高频的操作之一,比如数据脱敏、模板渲染、文本清洗、参数替换等场景都离不开它。Java 的String类内置了多种替换方法,同时也支持正则表达式、批量替换等进阶操作。本文从基础方法到复杂场景,拆解字符串替换的核心用法与避坑要点。

一、核心替换方法:replace /replaceAll/replaceFirst

Java String 类提供了 3 个核心替换方法,三者的核心区别在于是否支持正则表达式替换范围,具体对比如下:
 
方法名匹配规则替换范围核心特点
replace() 普通字符 / 字符串 所有匹配项 不支持正则,性能高
replaceAll() 正则表达式 所有匹配项 支持复杂正则,需注意转义
replaceFirst() 正则表达式 第一个匹配项 仅替换首次出现的匹配内容

1. 基础替换:replace ()(无正则,最常用)

replace() 有两个重载版本:
 
  • replace(char oldChar, char newChar):替换所有指定字符;
  • replace(CharSequence target, CharSequence replacement):替换所有指定字符串。
 
实例 1:替换单个字符
 
public class StringReplaceDemo {public static void main(String[] args) {String str = "Java is easy, Java is fun";// 替换所有字符'a'为'A'String result = str.replace('a', 'A');System.out.println(result); // 输出:JAva is eAsy, JAva is fun}
}
 
 
实例 2:替换字符串(非正则)
  
public class StringReplaceDemo {public static void main(String[] args) {String str = "2025-12-10";// 替换所有"-"为"/"(即使传类似正则的字符串,也会当作普通文本)String result = str.replace("-", "/");System.out.println(result); // 输出:2025/12/10}
}
 
 
关键注意:replace() 不解析正则表达式!比如传入 replace(".", "*"),会替换所有.字符,而非正则中的 “任意字符”。

2. 正则替换:replaceAll ()(匹配所有)

replaceAll() 支持正则表达式匹配,适合复杂规则的替换(如数字脱敏、格式转换)。
 
*实例 1:数据脱敏(替换所有数字为)**
 
public class StringReplaceDemo {public static void main(String[] args) {String phone = "手机号:13812345678";// 正则匹配所有数字(\\d),替换为*String maskedPhone = phone.replaceAll("\\d", "*");System.out.println(maskedPhone); // 输出:手机号:***********}
}
 
 
实例 2:正则分组替换(日期格式转换)
 
public class StringReplaceDemo {public static void main(String[] args) {String date = "2025-12-10";// 正则分组:(\d{4})匹配年,(\d{2})匹配月,(\d{2})匹配日,$1/$2/$3引用分组String newDate = date.replaceAll("(\\d{4})-(\\d{2})-(\\d{2})", "$1/$2/$3");System.out.println(newDate); // 输出:2025/12/10}
}
 
 
实例 3:转义特殊字符(.、*、| 等)
 
正则中.表示 “任意字符”,若需替换普通.,需用\\.转义,或用Pattern.quote()包裹目标字符串:
 
public class StringReplaceDemo {public static void main(String[] args) {String str = "www.baidu.com";// 错误:.匹配任意字符,会替换所有字符为-// String wrong = str.replaceAll(".", "-"); // 正确:转义.,替换所有.为-String correct1 = str.replaceAll("\\.", "-");// 更安全:用Pattern.quote()自动转义String correct2 = str.replaceAll(Pattern.quote("."), "-");System.out.println(correct1); // 输出:www-baidu-comSystem.out.println(correct2); // 输出:www-baidu-com}
}
 

3. 局部替换:replaceFirst ()(仅替换第一个匹配项)

适合只需替换首次出现的内容,比如修正文本中第一个错误字符、提取首个参数等。
public class StringReplaceDemo {public static void main(String[] args) {String str = "a1b2c3d4";// 仅替换第一个数字为*String result = str.replaceFirst("\\d", "*");System.out.println(result); // 输出:a*b2c3d4// 替换首个逗号为分号String text = "苹果,香蕉,橙子,葡萄";String textResult = text.replaceFirst(",", ";");System.out.println(textResult); // 输出:苹果;香蕉,橙子,葡萄}
}
 

二、进阶场景:复杂替换需求

场景 1:忽略大小写替换

若需替换时忽略字符大小写(如把AbC/ABC/abc都替换为xyz),可借助正则的(?i)标记(忽略大小写):
 
public class StringReplaceDemo {public static void main(String[] args) {String str = "AbC123abc456ABC";// (?i)标记忽略大小写,替换所有abc为xyzString result = str.replaceAll("(?i)abc", "xyz");System.out.println(result); // 输出:xyz123xyz456xyz}
}
 

场景 2:模板参数批量替换

开发中常遇到 “{name} 你好,今天是 {date}” 这类模板,需批量替换占位符,可结合Map+ 循环实现:
  
import java.util.HashMap;
import java.util.Map;public class TemplateReplaceDemo {public static void main(String[] args) {// 模板字符串String template = "您好,{name}!您的订单{orderId}已发货,预计{date}送达。";// 替换规则Map<String, String> params = new HashMap<>();params.put("{name}", "张三");params.put("{orderId}", "JD12345678");params.put("{date}", "2025-12-15");// 批量替换String result = template;for (Map.Entry<String, String> entry : params.entrySet()) {result = result.replace(entry.getKey(), entry.getValue());}System.out.println(result);// 输出:您好,张三!您的订单JD12345678已发货,预计2025-12-15送达。}
}
 
 
进阶优化:高频模板替换可使用 Apache Commons Text 的StrSubstitutor,简化代码: 
 
// 需引入依赖:org.apache.commons:commons-text:1.10.0
StrSubstitutor substitutor = new StrSubstitutor(params);
String result = substitutor.replace(template);
 
 

场景 3:批量替换多个关键词

比如同时替换文本中的 “垃圾”“脏话” 等敏感词,用Map存储替换规则,循环调用replace()
  
import java.util.HashMap;
import java.util.Map;public class MultiReplaceDemo {public static void main(String[] args) {String content = "这是垃圾内容,包含脏话!";Map<String, String> sensitiveWords = new HashMap<>();sensitiveWords.put("垃圾", "**");sensitiveWords.put("脏话", "##");String cleanContent = content;for (Map.Entry<String, String> entry : sensitiveWords.entrySet()) {cleanContent = cleanContent.replace(entry.getKey(), entry.getValue());}System.out.println(cleanContent); // 输出:这是**内容,包含##!}
}
 

场景 4:空值 / 空字符串处理

替换空字符串或 null 为默认值,需先判空避免空指针:
  
public class EmptyReplaceDemo {public static void main(String[] args) {String str = ""; // 空字符串String nullStr = null; // null// 替换空字符串为默认值String result1 = str.isEmpty() ? "默认值" : str;System.out.println(result1); // 输出:默认值// 替换null为默认值String result2 = nullStr == null ? "默认值" : nullStr;System.out.println(result2); // 输出:默认值// 注意:replace("", "x")会在每个字符间插入x(慎用)String test = "abc";System.out.println(test.replace("", "x")); // 输出:xa xb xc x(实际是xaxbxcx)}
}
 

三、避坑指南:常见错误与解决方案

1. 忽略 String 不可变性

String是不可变对象,所有替换方法都会返回新字符串,原字符串不会改变,必须接收返回值 
 
// 错误示例:未接收返回值,原字符串不变
String str = "abc";
str.replace('a', 'x');
System.out.println(str); // 输出:abc// 正确示例:接收返回值
String newStr = str.replace('a', 'x');
System.out.println(newStr); // 输出:xbc
 

2. 正则特殊字符未转义

使用replaceAll()/replaceFirst()时,若目标字符串包含.*+?|()[]{}^$等正则特殊字符,未转义会导致替换结果异常:
// 错误:|在正则中是“或”,会把"a|b"拆分为"a"或"b"
String str = "a|b|c";
String wrong = str.replaceAll("a|b", "*");
System.out.println(wrong); // 输出:*|*|c// 正确:用Pattern.quote()转义
String correct = str.replaceAll(Pattern.quote("a|b"), "*");
System.out.println(correct); // 输出:*|c
 

3. 频繁替换导致性能问题

若需多次替换(如循环中替换),String的不可变性会创建大量临时对象,建议改用StringBuilder
  
// 低效:多次创建String对象
String str = "a1b2c3d4";
for (int i = 0; i < 10; i++) {str = str.replace(String.valueOf(i), "*");
}// 高效:使用StringBuilder
StringBuilder sb = new StringBuilder("a1b2c3d4");
for (int i = 0; i < 10; i++) {int index = sb.indexOf(String.valueOf(i));while (index != -1) {sb.replace(index, index+1, "*");index = sb.indexOf(String.valueOf(i), index+1);}
}
String result = sb.toString();
System.out.println(result); // 输出:a*b*c*d*
 

4. 空指针异常(NPE)

调用替换方法前,务必检查字符串是否为 null:
  
public static String safeReplace(String str, String oldStr, String newStr) {if (str == null || oldStr == null || newStr == null) {return str; // 或返回默认值}return str.replace(oldStr, newStr);
}
 

四、实战案例:数据脱敏(手机号 + 身份证号)

结合正则替换实现常见的脱敏需求:
 
public class DataMaskDemo {// 手机号脱敏:保留前3后4,中间替换为****public static String maskPhone(String phone) {if (phone == null || !phone.matches("\\d{11}")) {return phone; // 非11位手机号直接返回}return phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");}// 身份证号脱敏:保留前6后4,中间替换为**********public static String maskIdCard(String idCard) {if (idCard == null || idCard.length() != 18) {return idCard; // 非18位身份证直接返回}return idCard.replaceAll("(\\d{6})\\d{8}(\\d{4})", "$1**********$2");}public static void main(String[] args) {System.out.println(maskPhone("13812345678")); // 输出:138****5678System.out.println(maskIdCard("110101199001011234")); // 输出:110101**********1234}
}
 

五、总结

Java 字符串替换的核心是根据场景选择合适的方法:
 
  • 简单替换(字符 / 固定字符串):用replace(),性能高且无需考虑正则;
  • 复杂规则替换(正则匹配):用replaceAll()/replaceFirst(),注意特殊字符转义;
  • 批量 / 模板替换:结合Map循环或第三方库(如 Apache Commons Text);
  • 高频替换:优先用StringBuilder提升性能,避免频繁创建 String 对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/996117.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年上海离婚房产律所权威推荐榜单:婚姻律所/继承律所/房产律所解决方案优选 - 品牌推荐官

随着近年来家庭资产结构的深刻变化,房产已成为绝大多数家庭最核心的资产。在离婚案件中,涉及房产分割争议的比例已超过七成,此类纠纷因其法律关系的复杂性、财产价值的高昂性以及证据梳理的繁琐性,对专业法律服务提…

综合安防数智管理平台

在数字化转型浪潮下,安防已从单一的视频监控演变为覆盖视频、报警、门禁、巡更、车辆管理等多元系统的综合体系。综合安防数智管理平台正是这一演进的核心载体——它通过统一的软件平台,把原本分散的安防子系统深度融…

医疗屏蔽房生产厂家哪家口碑好、实力强、信誉好? - 工业推荐榜

本榜单依托电磁防护设备领域全维度市场调研与医疗行业真实客户口碑,深度筛选出十家标杆企业,为医疗机构、科研院所及军工单位选型提供客观依据,助力精准匹配适配的医疗屏蔽解决方案伙伴。 TOP1 推荐:常州硕捷屏蔽设…

2025PBT磨粉机厂家全攻略:深挖10家技术派服务商 - 栗子测评

2025PBT磨粉机厂家全攻略:深挖10家技术派服务商在工程塑料加工领域,PBT(聚对苯二甲酸丁二醇酯)因其优异的机械性能和电绝缘性被广泛应用,但其韧性、吸湿性等特点也对磨粉设备提出了更高要求。选择一家专业的PBT磨粉…

react 性能优化的方案

React 的性能优化有非常多成熟的方案 一、组件层级的性能优化 1. 使用 React.memo(函数组件) 避免父组件渲染时导致子组件无意义渲染。 const Child = React.memo(function Child(props) {return <div>{props.…

【IEEE出版 | EI检索】第二届能源技术与电气电力国际学术会议 (ETEP 2025)

由南华大学主办、哈尔滨工业大学和华北电力大学支持的第二届能源技术与电气电力国际学术会议(ETEP 2025)将于2025年12月26日至28日在中国衡阳举行。【南华大学主办,哈尔滨工业大学、华北电力大学共同支持!前几届均…

2025年度中国差速轮推荐厂家排行榜:差速轮解决方案提供商与 - myqiye

本榜单依托全维度市场调研与真实行业口碑,深度筛选出五家标杆企业,为企业选型提供客观依据,助力精准匹配适配的差速轮服务伙伴。 TOP1 推荐:江苏亿控智能装备有限公司 推荐指数:★★★★★ 口碑评分:国内差速轮领…

2025年五大专业美缝品牌企业推荐,美缝公司排名全解析 - 工业品牌热点

在装修领域,美缝是提升家居质感的点睛之笔,但市场产品同质化严重、施工技术参差不齐,让消费者与美缝师难以抉择。以下依据技术实力、产品品质、服务体系等维度,为你推荐2025年十大专业美缝品牌企业,助力避开行业坑…

2025年电磁吸盘优质供应商TOP5推荐,专业电磁吸盘生产厂 - mypinpai

在工业自动化与智能制造的浪潮中,电磁吸盘作为金属加工、物流搬运等领域的核心设备,其性能稳定性与安全性直接影响生产效率。面对市场上众多电磁吸盘供应商,如何选择兼具技术实力与服务保障的合作伙伴?以下依据产品…

2025年度五大食用菌机械设备资深厂商排行榜,新测评精选食用 - 工业推荐榜

为帮食用菌种植户、合作社及工厂高效锁定适配自身需求的机械设备合作伙伴,避免选型走弯路,我们从技术落地能力(如设备稳定性、功能适配性)、产品工艺水准(含核心部件耐用性、自动化程度)、全周期服务质量(覆盖安…

2025年高效除尘器制造企业推荐:定制与科技驱动的除尘方案全 - myqiye

在环保政策日益严格的当下,工业企业对高效除尘器的需求愈发迫切。尤其在超净排放要求(粉尘浓度低于5mg/Nm)下,如何选择靠谱的除尘器制造企业成为关键。本文基于技术实力、定制能力、行业口碑等维度,推荐2025年高效…

2025年郑州宠物美容学校排名TOP5权威推荐:甄选机构助力 - 工业品牌热点

随着宠物经济爆发式增长,2024年中国宠物服务市场规模突破2500亿元,宠物美容师岗位缺口超30万人。但行业乱象频发:62%学员遭遇无证机构虚假宣传,45%因实操少结业后无法独立上手,38%被就业保障空头承诺坑害。面对混…

2025等离子表面处理机制造厂TOP5权威推荐:甄选靠谱服务 - mypinpai

在轻量化与环保趋势推动下,聚丙烯(PP)材料凭借耐腐蚀、低密度特性广泛应用于汽车、医疗及包装领域,但表面能低、化学惰性强的缺陷导致涂装脱落、粘接失效等问题频发。2024年数据显示,PP制品企业因表面处理不当造成…

HTML 动漫主题站模板(蜡笔小新风格)

一款专为动漫爱好者设计的主题网站模板,采用暖橙色渐变配色方案,设计温馨活泼,适合动漫主题站、粉丝社区、作品展示等多种场景使用。项目地址:https://www.diamaxiaoku.com/products/34✨ 项目特色 🎨 设计亮点暖…

2025年上海婚姻律所权威推荐榜单:继承律所/房产律所/离婚事务所专业律师精选 - 品牌推荐官

根据司法部近年统计数据显示,全国婚姻家事案件数量持续攀升,其中上海地区因家庭结构多元、涉外商事活动频繁,案件呈现高标的额、法律关系复杂、涉外因素多的特点。在此背景下,婚姻家事法律服务需求日益专业化、精细…

2025年度菌袋分离机制造商推荐排行榜,专业菌袋分离机制造商 - 工业推荐榜

为帮助食用菌种植企业、有机肥厂精准锁定适配自身生产需求的菌袋分离机供应商,避免因设备选型不当导致的生产效率低下、维护成本激增等问题,我们从技术适配性(如湿袋分离能力、杂质耐受度)、生产效率表现(单位时间…

2025年隆昌发酵缸陶坛生产源头厂家TOP5推荐:优质供应商 - 工业品牌热点

在白酒酿造、泡菜腌制等土陶制品核心应用领域,发酵缸与陶坛的品质直接决定下游产品的风味与生产稳定性。2023年行业调研显示,超35%的酒厂因陶坛砂眼渗漏损失10%-15%基酒,40%的餐饮企业因泡菜坛密封失衡导致发酵失败…

2025年财税服务公司年度排名:九洲财务的实力怎样? - myqiye

在数字经济时代,企业财税管理的智能化转型已成为刚需——但选择靠谱的财税服务商却让无数企业与求职者犯难:如何判断服务商的技术实力?员工薪资待遇是否匹配行业水平?招聘信息是否真实透明?2025年,我们结合行业口…

2025年五大实力不错的美缝品牌企业推荐,诚信的美缝企业全解 - mypinpai

在家庭装修的后一公里,美缝不仅是瓷砖缝隙的美容师,更是家居颜值与耐用性的关键一环。面对市场上鱼龙混杂的美缝产品与服务,如何挑选到不错的美缝品牌企业和诚信的美缝企业,成为许多业主与装修公司的难题。以下依据…