1、通过表头获取需要处理的下标列
注:此处导出表格时对关键字进行脱敏处理
/**
* .
* 对表头进行过滤判断
*
* @param headers 表头
* @return 对应的下标列及方法名
*/
public static Map<String, String> headsFilter(String[] headers) {
Map<String, String> indexItem = new HashMap<>();
int index = 0;//具体下标
for (String word : headers) {
if (word.matches("((?=.*证号)|(?=.*身份证)|(?=.*护照号码)|(?=.*客户号)|(?=.*证件号码))^.*$")) {
indexItem.put(String.valueOf(index), "maskIdCard");
} else if (word.matches("((?=.*账户)|(?=.*卡号)|(?=.*银行卡卡号))^.*$")) {
indexItem.put(String.valueOf(index), "bankCard");
} else if (word.matches("((?=.*址)|(?=.*地址))^.*$")) {
indexItem.put(String.valueOf(index), "address");
} else if (word.matches("((?=.*手机号)|(?=.*主叫号码)|(?=.*被叫号码))^.*$")) {
indexItem.put(String.valueOf(index), "maskPhone");
} else if (word.matches("(?=.*姓名).*$")) {
indexItem.put(String.valueOf(index), "chineseName");
} else if (word.matches("(?=.*固定电话).*$")) {
indexItem.put(String.valueOf(index), "fixedPhone");
} else if (word.matches("(?=.*邮箱).*$")) {
indexItem.put(String.valueOf(index), "email");
}
index++;
}
return indexItem;
}
2、脱敏字段具体处理
/**
* .
* 字段信息脱敏处理
*
* @param objStr 原始字段
* @param methodName 过滤具体方法
* @return 返回已脱敏字段
*/
public static String filtration(Object objStr, String methodName) {
String newStr = "";
String oldStr = String.valueOf(objStr);
if (StringUtils.isBlank(oldStr)) {
return oldStr;
}
try {
switch (methodName) {
case "bankCard": //银行卡号
newStr = oldStr.replaceAll("(\\w{4})\\w*(\\w{4})", "$1***********$2");
break;
case "fixedPhone"://固定电话
newStr = oldStr.substring(0, (oldStr.indexOf('-') + 1)) + "******" + oldStr.substring(oldStr.length() - 2);
break;
case "address": //住址数字
newStr = oldStr.replaceAll("[\\d一二三四五六七八九十壹贰叁肆伍陆柒捌玖拾佰]+", "***");
break;
case "chineseName": //中文姓名
String name = StringUtils.left(oldStr, 1);
newStr = StringUtils.rightPad(name, StringUtils.length(oldStr), "*");
break;
case "email": //邮箱
int index = oldStr.indexOf('@');
if (index == 2) {//下标为2:@前面数字小于两位完全拼接显示
newStr = oldStr.substring(0, index) + "****" + oldStr.substring(index, oldStr.length());
} else {
newStr = oldStr.replaceAll("(^\\w{3})[^@]*(@.*$)", "$1****$2");
}
break;
case "maskIdCard": //证件号
if (oldStr.length() == 15) {
newStr = oldStr.replaceAll("(\\w{3})\\w*(\\w{2})", "$1**********$2");
} else if (oldStr.length() == 18) {
newStr = oldStr.replaceAll("(\\w{3})\\w*(\\w{2})", "$1*************$2");
}
break;
case "maskPhone": //手机号
if (oldStr.matches("^(852|853)\\d*$")) {//港澳手机号处理
newStr = oldStr.substring(3, 5) + "****" + oldStr.substring((oldStr.length() - 2));
} else if (oldStr.matches("^(886)\\d*$")) {//台湾手机号处理 //8860930849111
newStr = oldStr.substring(3, 5) + "****" + oldStr.substring((oldStr.length() - 3));
} else {
newStr = oldStr.replaceAll("(\\w{3})\\w*(\\w{4})", "$1****$2");
}
break;
default:
logger.error("方法未定义,字段脱敏失败");
}
} catch (Exception e) {
logger.error(String.format("处理导出字段脱敏异常[Error=%s]...", e.getMessage()));
}
return newStr;
}
3、字段脱敏后效果
"客户姓名" "IP地址" "客户微信名" "手机号" "银行卡号" "身份证号" "固定电话" "电子邮箱" "家庭住址"
"刘*****" "***.***.***.***" "孤鸿寡鹄3333" "156****9452" "6222***********1975" "513*************96" "021-******18" "250****@qq.com" "上海市徐汇区***栋***楼***室"
4、脱敏操作
//去除字符串中连续出现三位的数字
String str= "wei23jin234";
String s = str.replaceAll("\\d{3,}", "***");
System.out.println(s);//wei23jin***
//替换指定特殊字符内容
String str1 = "《@@@@@@@1》";
String ty = str1.replaceAll("(《).*?(》)", "$1******$2");
System.out.println(ty);//《******》