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. 【LeetCode动态规划#15】最长公共子序列II

    最长公共子序列(二) 描述 给定两个字符串str1和str2,输出两个字符串的最长公共子序列.如果最长公共子序列为空,则返回"-1".目前给出的数据,仅仅会存在一个最长的公共子序列 ...

  2. React之父组件向子组件传值

    class Parent extends React.Component{ constructor(){ super(); this.state={co:"red"} } rend ...

  3. [Linux ] 编译 ffmpeg 使用 AV1 编码 svt_av1 编码器

    编译带 AV1 编码器的 ffmpeg 安装 aom git clone --depth 1 https://aomedia.googlesource.com/aom mk build cmake - ...

  4. 【简历模板】极简Markdown程序员简历模板

    前言 最近在找工作,一份好的简历是敲门砖,所以跟大家分享下简洁明了大方MarkDown的简历模板和在线编辑工具 在线工具 冷熊 Java工程师简历模板 下载 点击下载 预览 个人信息 xxx/男/19 ...

  5. api网关介绍

    1.什么是网关 API网关是一个系统的唯一入口. 是众多分布式服务唯一的一个出口. 它做到了物理隔离,内网服务只有通过网关才能暴露到外网被别人访问. 简而言之:网关就是你家的大门 2.提供了哪些功能 ...

  6. ansible 自动化运维(1)

      ansible 简介 ansible 是什么? ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.chef.func.fabric)的优点,实现了批量 ...

  7. C++学习笔记之基础语法

    目录 基础语法 switch和if区别 枚举定义及作用域 结构体数据耐齐--缺省对齐原则 函数重载overload与C++Name Mangling 指向函数的指针与返回指针的函数 基础语法 swit ...

  8. day10-面向对象

    面向对象 1.什么是面向对象? 1.1面向过程&&面向对象 面向过程思想: 步骤清晰简单,第一步做什么,第二步做什么-- 面对过程适合处理一些较为简单地问题 面向对象思想 物以类聚,分 ...

  9. C++自定义比较函数的bug

    auto cmp = [] (int x, int y) {return true;}; priority_queue<int, vector<int> , cmp> q; 报 ...

  10. 03.Android之View原理问题

    目录介绍 3.0.0.1 View的绘制需要经过哪些过程?有哪些常用回调方法?View的绘制流程的详细流程是怎样的? 3.0.0.2 View绘制流程,当一个TextView的实例调用setText( ...