java 对人名和电话 脱敏-replaceAll
学习了《正则匹配人名》和《正则匹配电话号码》,如果要一起进行脱敏处理,改怎么做? 脱敏的,考虑配置规则,进行匹配的方式进行处理:
脱敏规则:
DesensitizationRules
@Data
public class DesensitizationRules {/*** 匹配的字段名称*/public String fieldName;/*** 是否开启匹配 true 是 false 否*/public Boolean enabled;/*** 匹配的表达式*/public String regularExpr;/*** 替换的表达式*/public String replaceExpr;
}
数据模拟:
public static List<DesensitizationRules> mockConfig(){String data = "[\n" +"\t{\n" +"\t\t\"fieldName\": \"staffName\",\n" +"\t\t\"enabled\": true,\n" +"\t\t\"regularExpr\": \"(\\\\S)([a-zA-Z0-9_\\\\s\\\\u4e00-\\\\u9fa5]+)\",\n" +"\t\t\"replaceExpr\": \"$1**\"\n" +"\t},\n" +"\t{\n" +"\t\t\"fieldName\": \"mobile\",\n" +"\t\t\"enabled\": true,\n" +"\t\t\"regularExpr\": \"(\\\\d{3})\\\\d{4}(\\\\d{4})\",\n" +"\t\t\"replaceExpr\": \"$1****$2\"\n" +"\t},\n" +"\t{\n" +"\t\t\"fieldName\": \"tel\",\n" +"\t\t\"enabled\": false,\n" +"\t\t\"regularExpr\": \"(\\\\d{3})\\\\d{4}(\\\\d{4})\",\n" +"\t\t\"replaceExpr\": \"$1****$2\"\n" +"\t},\n" +"\t{\n" +"\t\t\"fieldName\": \"email\",\n" +"\t\t\"enabled\": true,\n" +"\t\t\"regularExpr\": \"(\\\\w?)(\\\\w+)(\\\\w)(@\\\\w+\\\\.[a-z]+(\\\\.[a-z]+)?)\",\n" +"\t\t\"replaceExpr\": \"$1****$3$4\"\n" +"\t}\n" +"]";DesensitizationRules single;List<DesensitizationRules> rules = new ArrayList<>();for(Object map: JSONArray.parseArray(data)){single= JSON.parseObject(JSONObject.toJSONString(map),DesensitizationRules.class);rules.add(single);}return rules;}
测试数据:
FlowStaff
@Data
public class FlowStaff {private String staffName;private String phs;private String email;private String mobile;private String tel;private String orgId;private String orgName;private String staffId;private String staffaName;private String regionName;private String regionId;
}
模拟数据:
public static List<FlowStaff> mockData(){String receiveStr = "[\n" +"\t{\n" +"\t\t\"staffName\": \"张三飞\",\n" +"\t\t\"phs\": null,\n" +"\t\t\"email\": \"13456789@qq.com\",\n" +"\t\t\"mobile\": \"18920220711\",\n" +"\t\t\"tel\": \"18920220711,18955462232\",\n" +"\t\t\"orgName\": \"组织机构/公司领导部门\",\n" +"\t\t\"staffId\": \"1\",\n" +"\t\t\"staffaName\": null,\n" +"\t\t\"regionName\": \"福建\",\n" +"\t\t\"orgId\": 59\n" +"\t},\n" +"\t{\n" +"\t\t\"staffName\": \"Luck Kevin\",\n" +"\t\t\"phs\": null,\n" +"\t\t\"email\": \"12345678@qq.com\",\n" +"\t\t\"mobile\": \"18920228733\",\n" +"\t\t\"tel\": \"18920228733,18955462252\",\n" +"\t\t\"orgName\": \"组织机构/公司领导部门\",\n" +"\t\t\"staffId\": \"2\",\n" +"\t\t\"staffaName\": null,\n" +"\t\t\"regionName\": \"福建\",\n" +"\t\t\"orgId\": 59\n" +"\t}\n" +"]";System.out.println(receiveStr);FlowStaff single;List<FlowStaff> flowStaffs = new ArrayList<>();for(Object map: JSONArray.parseArray(receiveStr)){single= JSON.parseObject(JSONObject.toJSONString(map),FlowStaff.class);flowStaffs.add(single);}return flowStaffs;}
处理:
根据规则,先获取配置中enabled 为true,然后对数据进行依次替换脱敏:
public static void main(String args[]) {List<DesensitizationRules> rules = mockConfig();List<FlowStaff> receivers = mockData();// 过滤需要脱敏的enable = true的配置List<DesensitizationRules> filterRules = ListUtils.emptyIfNull(rules).stream().filter(DesensitizationRules::getEnabled).collect(Collectors.toList());if(CollectionUtils.isEmpty(filterRules)){System.out.println("not have the config rule!");return;}String receiversStr = JSONObject.toJSONString(receivers);for (DesensitizationRules value : filterRules) {receiversStr = replaceCommon(receiversStr, value.getFieldName(), value.getRegularExpr(), value.getReplaceExpr());}System.out.println("============ mask ============ ");System.out.println(receiversStr);}public static String replaceCommon(String aimStr, String key, String regularExpr, String replaceExpr) {return aimStr.replaceAll( "\""+key+"\""+":\\s*\""+regularExpr+"\"", "\""+key+"\""+":\""+replaceExpr+"\"");}
输出:
[{"email": "1****9@qq.com","mobile": "189****0711","orgId": "59","orgName": "组织机构/公司领导部门","regionName": "福建","staffId": "1","staffName": "张**","tel": "18920220711,18955462232"},{"email": "1****8@qq.com","mobile": "189****8733","orgId": "59","orgName": "组织机构/公司领导部门","regionName": "福建","staffId": "2","staffName": "L**","tel": "18920228733,18955462252"}
]
把tel的配置enabled改成true再执行,输出:
============ mask ============
[{"email": "1****9@qq.com","mobile": "189****0711","orgId": "59","orgName": "组织机构/公司领导部门","regionName": "福建","staffId": "1","staffName": "张**","tel": "189****0711,189****2232"},{"email": "1****8@qq.com","mobile": "189****8733","orgId": "59","orgName": "组织机构/公司领导部门","regionName": "福建","staffId": "2","staffName": "L**","tel": "189****8733,189****2252"}
]
可以看到人名(staffName)和电话号码(mobile),都进行了脱敏。 tel进行设置后,也脱敏了。达到想要的效果
总结:
对数据进行脱敏,可以考虑根据配置规则,这样可以动态修改规则,指定字段内容进行脱敏,会比较方便。 也可以考虑用正则表达式
《java 使用正则进行匹配人名电话》
相关文章:
java 对人名和电话 脱敏-replaceAll
学习了《正则匹配人名》和《正则匹配电话号码》,如果要一起进行脱敏处理,改怎么做? 脱敏的,考虑配置规则,进行匹配的方式进行处理: 脱敏规则: DesensitizationRules Data public class Desens…...
计算机网络:网络层 —— 网络地址转换 NAT
文章目录 网络地址转换 NAT 概述最基本的 NAT 方法NAT 转换表的作用 网络地址与端口号转换 NAPTNAT 和 NAPT 的缺陷 网络地址转换 NAT 概述 尽管因特网采用了无分类编址方法来减缓 IPv4 地址空间耗尽的速度,但由于因特网用户数量的急剧增长,特别是大量小…...
【Pikachu靶场:XSS系列】xss之过滤,xss之htmlspecialchars,xss之herf输出,xss之js输出通关啦
一、xss之过滤 <svg onloadalert("过关啦")> 二、xss之htmlspecialchars javascript:alert(123) 原理:输入测试文本为herf的属性值和内容值,所以转换思路直接变为js代码OK了 三、xss之href输出 JavaScript:alert(假客套) 原理&#x…...
面向制造和装配的产品设计指南(二):面向装配的设计指南
参考引用 面向制造和装配的产品设计指南 1. 概述 1.1 装配的概念 装配是指把多个零件组装成产品,使得产品能够实现相应的功能并体现产品的质量,装配包含三层含义 把零件组装在一起实现相应的功能体现产品的质量 1.2 最好和最差的装配工序 1.3 面向装…...
Python中的PDF处理工具:PyPDF2和ReportLab使用指南
Python中的PDF处理工具:PyPDF2和ReportLab使用指南 在日常工作和项目中,PDF 文件处理是个常见需求,不论是合并报告、加密文档、填充表单,还是生成发票。Python 中有许多用于操作 PDF 文件的库,其中 PyPDF2 和 ReportL…...
【vxe-table】多选筛选项对列表的列进行动态的显示与隐藏
需求: 列表的组成部分由:一些固定的列,如:姓名,工号,以及 需要动态显示与隐藏的列,如:出勤、旷工、事假、病假等假勤类型 1、通过多选框多选,展示选中的列,未选中的不展示…...
微信小程序uniapp+vue飞机订票航空售票系统
文章目录 项目介绍具体实现截图技术介绍mvc设计模式小程序框架以及目录结构介绍错误处理和异常处理java类核心代码部分展示详细视频演示源码获取 项目介绍 对于小程序飞机订票信息管理所牵扯的信息管理及数据保存都是非常多的,举例像所有的管理员;管理员…...
如何取消Outlook中的循环会议
如何取消Outlook中的循环会议 参考链接:https://iknow.lenovo.com.cn/detail/195430 1、打开Outlook,进入 日历 视图界面; 2、 选择并双击要取消的循环会议; 3、 在 打开定期项目 对话框中选择整个序列,然后单击 确…...
Docker-- cgroups资源控制实战
上一篇:容器化和虚拟化 什么是cgroups? cgroups是Linux内核中的一项功能,最初由Google的工程师提出,后来被整合进Linux内核; 它允许用户将一系列系统任务及其子任务整合或分隔到按资源划分等级的不同组内,从而为系统…...
使用Python和Vosk库实现语音识别
使用Python和Vosk库实现语音识别 在人工智能和机器学习领域,语音识别技术正变得越来越重要。Python作为一种强大的编程语言,拥有丰富的库和框架,可以方便地实现语音识别功能。今天,我们将介绍如何使用Python中的SpeechRecognitio…...
stm32使用串口的轮询模式,实现数据的收发
------内容以b站博主keysking为原型,整理而来,用作个人学习记录。 首先在STM32CubeMX中配置 前期工作省略,只讲重点设置。 这里我配置的是USART2的模式。 会发现,PA2和PA3分别是TX与RX,在连接串口时需要TX对RX&…...
105. UE5 GAS RPG 搭建主菜单
在这一篇,我们将实现对打开游戏显示的主菜单进行搭建,主菜单将显示游戏主角,游戏名称和进入游戏和退出游戏两个按钮。 搭建菜单场景 我们将主菜单设置为一个单独的场景,前面可以显示对应的UI控件,用于玩家操作&#…...
基于 JAVASSM(Java + Spring + Spring MVC + MyBatis)框架开发一个医院挂号系统
基于 JAVASSM(Java Spring Spring MVC MyBatis)框架开发一个医院挂号系统是一个实用的项目。 步骤一:需求分析 明确系统需要实现的功能,比如: 用户注册和登录查看医生列表预约挂号查看预约记录取消预约管理员管…...
Golang | Leetcode Golang题解之第540题有序数组中的单一元素
题目: 题解: func singleNonDuplicate(nums []int) int {low, high : 0, len(nums)-1for low < high {mid : low (high-low)/2mid - mid & 1if nums[mid] nums[mid1] {low mid 2} else {high mid}}return nums[low] }...
影刀RPA实战:嵌入python,如虎添翼
1. 影刀RPA与Python的关系 影刀RPA与Python的关系可以从以下几个方面来理解: 技术互补:影刀RPA是一种自动化工具,它允许用户通过图形化界面创建自动化流程,而Python是一种编程语言,常用于编写自动化脚本。影刀RPA可以…...
es 数据清理delete_by_query
POST /索引名/_delete_by_query?conflictsproceed&scroll_size2000&wait_for_completionfalse&slices36 {"size": 2000, "query": {"bool": { "must": [{"terms": {"rule_id": [800007]}}]}} }slice…...
【每日 C/C++ 问题】
一、C 中类的三大特性是什么?请简要解释。 封装、继承、多态 封装:将事物的属性(成员变量)和行为(成员函数)封装在一起形成一个类。并且可以设置相应的访问权限(私有的 受保护的 公有的&#…...
stm32学习4
学习目录 一.流水灯1.创建文件2.编写相关代码 一.流水灯 1.创建文件 将方法进行分类保存在不同的 .c 文件中,方便复用和寻找; 创建Hardware\LED文件,其中有led.c和led.h文件,用于存放有关LED灯操作的方法; 在User文…...
Midjourney国内直登
Midjourney确实是一个强大的AI绘画工具,能够根据用户输入的文本生成高质量的图像。然而,由于国内的网络限制,直接访问Midjourney可能会遇到障碍。 目前,已经有一些国内代理或中转平台可以帮助用户更方便地使用Midjourney…...
【双目视觉标定】——3面结构光相机标定实践(获取相机内参)~未完待续
相机标定基本原理及双目相机内参解析 相机标定是计算机视觉中的一个重要步骤,旨在确定相机的内部和外部参数,以便在图像处理中进行准确的三维重建、物体识别等任务。本文将重点讲解双目相机的内参和外参原理,并结合实际参数进行分析。 一、…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
Android屏幕刷新率与FPS(Frames Per Second) 120hz
Android屏幕刷新率与FPS(Frames Per Second) 120hz 屏幕刷新率是屏幕每秒钟刷新显示内容的次数,单位是赫兹(Hz)。 60Hz 屏幕:每秒刷新 60 次,每次刷新间隔约 16.67ms 90Hz 屏幕:每秒刷新 90 次,…...
构建Docker镜像的Dockerfile文件详解
文章目录 前言Dockerfile 案例docker build1. 基本构建2. 指定 Dockerfile 路径3. 设置构建时变量4. 不使用缓存5. 删除中间容器6. 拉取最新基础镜像7. 静默输出完整示例 docker runDockerFile 入门syntax指定构造器FROM基础镜像RUN命令注释COPY复制ENV设置环境变量EXPOSE暴露端…...
Java高级 |【实验八】springboot 使用Websocket
隶属文章:Java高级 | (二十二)Java常用类库-CSDN博客 系列文章:Java高级 | 【实验一】Springboot安装及测试 |最新-CSDN博客 Java高级 | 【实验二】Springboot 控制器类相关注解知识-CSDN博客 Java高级 | 【实验三】Springboot 静…...
