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);//《******》

Java处理关键字进行脱敏操作的更多相关文章

  1. java的基础知识文件操作和标识符

    1.文件夹的操作 dir :显示当前文件夹中的所有文件和文件夹. cd 路径:  进入到指定的路径. cd ..  : 回到上一级目录 cd  \ : 回到当前目录的跟目录 md 文件夹名  创建一个 ...

  2. Java API —— IO流(数据操作流 & 内存操作流 & 打印流 & 标准输入输出流 & 随机访问流 & 合并流 & 序列化流 & Properties & NIO)

    1.操作基本数据类型的流     1) 操作基本数据类型 · DataInputStream:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型.应用程序可以使用数据输出 ...

  3. 从根源上解析 Java volatile 关键字的实现

    1.解析概览 内存模型的相关概念 并发编程中的三个概念 Java内存模型 深入剖析Volatile关键字 使用volatile关键字的场景 2.内存模型的相关概念 缓存一致性问题.通常称这种被多个线程 ...

  4. Java 并发 关键字volatile

    Java 并发 关键字volatile @author ixenos volatile只是保证了共享变量的可见性,不保证同步操作的原子性 同步块 和 volatile 关键字机制 synchroniz ...

  5. 【转载】java final 关键字的几种用法

    原文链接点这里,感谢博主分享 在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构 ...

  6. 【转载】java static 关键字的四种用法

    原文链接点这里,感谢博主分享 在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构 ...

  7. [java]final关键字的几种用法

    在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.下面我们来了解一下final ...

  8. [java]static关键字的四种用法

    在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.下面我们先来了解一下stat ...

  9. [Java并发编程(三)] Java volatile 关键字介绍

    [Java并发编程(三)] Java volatile 关键字介绍 摘要 Java volatile 关键字是用来标记 Java 变量,并表示变量 "存储于主内存中" .更准确的说 ...

  10. java transient关键字作用,使用场景。

    java transient关键字作用,使用场景. 2016年08月31日 15:31:10 阅读数:4280 transient的作用及使用方法,官方解释为: Variables may be ma ...

随机推荐

  1. Elasticsearch系列之-查询

    Elasticsearch之-查询 查询分类: 基本查询:使用es内置查询条件进行查询 组合查询:把多个查询组合在一起进行复合查询 过滤:查询的同时,通过filter条件在不影响打分的情况下筛选数据 ...

  2. ASP.NET Core MVC应用模型的构建[3]: Controller的收集

    从编程的角度来看,一个MVC应用是由一系列Controller类型构建而成的,所以对于一个代表应用模型的ApplicationModel对象来说,它的核心就是Controllers属性返回的一组Con ...

  3. 【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数

    问题描述 在Azure App Service for Windows的环境中,部署.NET应用,其中使用了 SAP NetWeaver RFC函数 (需要加载 sapnwrfc.dll).详细的错误 ...

  4. Python 中read()、 readline() 、readlines()三者之间的区别?

    read()方法用于一次性读取整个文件的内容,并将其作为一个字符串返回. readline()方法用于逐行读取文件的内容.每次调用readline()方法,它会读取文件的下一行,并将其作为一个字符串返 ...

  5. Mapbox实战项目(1)-栅格图片图层实现地图方位展示

    需求背景 需要实现地图上展示一个类似于罗盘的标记,随着地图的缩放.切换.旋转等,能够在地图的中央指示出地图的方位. 系统自带的方位控件太小,在特殊业务场景下不够醒目. 技术选型 Mapbox 实现分析 ...

  6. Java 数组对象 小测试

    1 package com.bytezero.bank; 2 /** 3 * 4 * @Description 5 * @author Bytezero·zhenglei! Email:4204982 ...

  7. 字典嵌套列表 与 列表嵌套字典 导出为csv 的方法

    字典嵌套列表 导出csv {'rank': ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '1 ...

  8. matlab修改读取mat文件后的变量名

    代码如下: %% str1=load('CH1.mat'); val_names = fieldnames(str1); % 获取结构体后那个未知的变量名 data1 = getfield(str1, ...

  9. 引领AI创意教育新浪潮,瑞云AIGC实训平台解决方案来了

    过去的2023年,AI(人工智能)成为了年度科技圈关键词,各行各业都在AI化,据统计,AIGC市场规模预计到2030年将达到万亿级别,这不仅是市场的趋势,更是创新的机遇. 教育行业更是如此,许多高校和 ...

  10. 记录--手把手带你开发一个uni-app日历插件(并发布)

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 相信我们在开发各类小程序或者H5,甚至APP时,会把uni-app作为一个技术选型,其优点在于一键打包多端运行,较为强大的跨平台的性能.但 ...