如何用Java正则表达式正确屏蔽XML标签<Name1>内的前5个字符?
解决方案
灵活实现(推荐)
使用Java正则替换结合Lambda表达式,可同时处理标签内字符长度大于5和小于等于5的场景:
// 测试用例1:长度大于5的内容 String s1 = "<Name1>Edward Smith</Name1>"; // 测试用例2:长度等于5的内容 String s2 = "<Name1>Alice</Name1>"; // 测试用例3:长度小于5的内容 String s3 = "<Name1>Bob</Name1>"; // 统一处理逻辑 String regex = "<Name1>(.{0,5})(.*?)</Name1>"; System.out.println(s1.replaceAll(regex, matcher -> { String firstSegment = matcher.group(1); String remaining = matcher.group(2); return "<Name1>" + "*".repeat(firstSegment.length()) + remaining + "</Name1>"; })); System.out.println(s2.replaceAll(regex, matcher -> { String firstSegment = matcher.group(1); String remaining = matcher.group(2); return "<Name1>" + "*".repeat(firstSegment.length()) + remaining + "</Name1>"; })); System.out.println(s3.replaceAll(regex, matcher -> { String firstSegment = matcher.group(1); String remaining = matcher.group(2); return "<Name1>" + "*".repeat(firstSegment.length()) + remaining + "</Name1>"; }));
输出结果
<Name1>*****d Smith</Name1> <Name1>*****</Name1> <Name1>***</Name1>
问题原因分析
你之前的正则"<Name1>(.{5})(?:.+?)</Name1>"逻辑完全颠倒:
- 它捕获了标签内的前5个字符到
$1,替换后变成*****$1,相当于保留前5个字符、用*****覆盖后续内容,和需求正好相反。
正则逻辑说明
- 正则
<Name1>(.{0,5})(.*?)</Name1>将标签内内容拆分为两组:(.{0,5}):匹配前0-5个字符,覆盖所有长度场景(.*?):匹配剩余所有字符,长度≤5时为空
- 通过Lambda表达式动态生成对应数量的
*替换第一组内容,再拼接剩余部分,完全符合需求。
内容的提问来源于stack exchange,提问作者JAK
相关产品推荐
相关产品推荐

