如何用正则表达式选中捕获组中最后4个字符之前的所有内容?
如何使用正则表达式选中捕获组中最后4个字符之前的所有内容?
需求明确
需要对字符串中idNumber=后的内容按以下规则处理:
- 当内容长度>4时:将最后4位之前的所有字符替换为
*,保留最后4位 - 当内容长度=4时:完全保留原内容
- 当内容长度<4时:替换前部分为
*,保留剩余内容(示例未覆盖此场景,可按需调整逻辑)
解决方案
单纯靠正则替换无法直接根据匹配内容的长度做分支处理,需要结合Java的Matcher类实现动态替换逻辑:
完整代码
import java.util.regex.Matcher; import java.util.regex.Pattern; public class IdNumberMasking { public static void main(String[] args) { String str = "{Index1=StudentData(studentName=Sam, idNumber=321231312), Index2=StudentData(studentName=Adam, idNumber=5675), Index3=StudentData(studentName=Lisa, idNumber=67124)}"; // 匹配idNumber=后到)之间的字母数字 Pattern pattern = Pattern.compile("(?<=idNumber=)[a-zA-Z0-9]+(?=\\))"); Matcher matcher = pattern.matcher(str); StringBuffer result = new StringBuffer(); while (matcher.find()) { String id = matcher.group(); String replacement; if (id.length() == 4) { replacement = id; } else if (id.length() > 4) { // 生成对应数量的*,拼接最后4位 replacement = "*".repeat(id.length() - 4) + id.substring(id.length() - 4); } else { // 长度<4的场景,这里实现为前缀加*保留原内容,可按需修改 replacement = "*" + id; } matcher.appendReplacement(result, replacement); } matcher.appendTail(result); System.out.println(result.toString()); } }
代码说明
正则表达式解析
(?<=idNumber=):正向零宽断言,确保匹配内容的前缀是idNumber=,但不捕获该前缀[a-zA-Z0-9]+:匹配idNumber=后的所有字母数字(修正了原正则漏写0的问题)(?=\)):正向零宽断言,确保匹配内容的后缀是),但不捕获该后缀
替换逻辑
- 遍历所有匹配到的
idNumber值 - 根据字符串长度分情况处理:
- 长度为4:直接保留原字符串
- 长度大于4:用
长度-4个*替换前半部分,拼接最后4位 - 长度小于4:示例未给出具体要求,这里默认在原内容前加一个
*,如果需要全部替换为*,可改为replacement = "*".repeat(id.length());
运行结果
执行代码后,输出与期望完全一致:
{Index1=StudentData(studentName=Sam, idNumber=*****1312), Index2=StudentData(studentName=Adam, idNumber=5675), Index3=StudentData(studentName=Lisa, idNumber=*7124)}
内容的提问来源于stack exchange,提问作者Liu
相关产品推荐
相关产品推荐

