//1.定义脱敏接口
public interface IReplaceMask {
public String maskStr(String str);
}
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//2.邮箱脱敏实现脱敏接口
public class EmailMask implements IReplaceMask{
public String maskStr(String email) {
Pattern pattern = Pattern.compile("(\\w{3})\\w+([a-zA-Z0-9]{2}@[a-z]+\\.[a-z]+)", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(email);
while (matcher.find()) {
String group = matcher.group();
String desensitizedEmail = group.replaceAll(".(?=.*[@])", "*");
//System.out.println("原始邮箱地址:" + email);
//System.out.println("脱敏后的邮箱地址:" + desensitizedEmail);
email=email.replaceAll(group,desensitizedEmail);
matcher = pattern.matcher(email);
}
return email;
}
}
//3.手机号脱敏规则实现脱敏接口
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PhoneMask implements IReplaceMask{
public String maskStr(String email) {
Pattern pattern = Pattern.compile("(\\d{3})\\d{4}(\\d{4})", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(email);
while (matcher.find()) {
String group = matcher.group();
StringBuilder desensitizedEmail = new StringBuilder(group.substring(0, 3));
for (int i = 0; i < (group.length() - 3); i++) {
desensitizedEmail.append("*");
}
email=email.replaceAll(group, desensitizedEmail.toString());
matcher = pattern.matcher(email);
}
return email;
}
}
import java.util.ArrayList;
import java.util.List;
//4.脱敏工具类getInstaces包含了手机脱敏和邮箱脱敏,可扩展通过list.add(new 新的脱敏规则类()))
public class ReplaceMaskUtils {
public static List<IReplaceMask> getInstaces() {
List<IReplaceMask> list = new ArrayList<IReplaceMask>();
list.add(new PhoneMask());
list.add(new EmailMask());
return list;
}
//应用所有的脱敏规则进行脱敏
public static String maskString(String str) {
List<IReplaceMask> instaces = ReplaceMaskUtils.getInstaces();
for (IReplaceMask instace : instaces) {
str = instace.maskStr(str);
}
return str;
}
}
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import java.util.ArrayList;
import java.util.List;
public class 正则脱敏测试 {
public static void main(String[] args) {
//1.构造复杂数据结构开始
List<Classes> classesList=new ArrayList<Classes>();
Classes classes = new Classes();
classes.setId("c1");
classes.setName("n1");
List<Student<QianBao>> stus = new ArrayList<Student<QianBao>>();
classes.setStudents(stus);
for (int i = 0; i < 3; i++) {
Student<QianBao> student = new Student<QianBao>();
student.setStuId("stuId" + i+" 18205943515");
student.setStuName("stuName" + i+"1061210163@qq.com");
QianBao q=new QianBao();
q.setqId("stuId"+i+"的钱包ID 18205943512");
q.setQn("stuName"+i+"的钱包Name 715600388@qq.com");
student.setData1(q);
stus.add(student);
}
classesList.add(classes);
Result<Classes> result=new Result<Classes>();
result.setData(classesList);
//1.构造复杂数据结构结束
//2.把复杂数据结构(嵌套泛型) 序列化成字符串
String s = JSON.toJSONString(result);
System.out.println(s);
//3.对序列化字符串进行脱敏,内部使用链式设计模式,循环替换手机号、邮箱进行脱敏
String string = ReplaceMaskUtils.maskString(s);
System.out.println(string);
//4.把脱敏后字符串还原成原先的数据结构
Result<Classes> result1 = JSON.parseObject(string, new TypeReference<Result<Classes>>() {
});
String s1 = JSON.toJSONString(result1);
//5.验证脱敏后的结构对JSON应字符串是否正确
System.out.println("s1==string \t"+s1.equals(string));
}
//以下是构造的复杂数据结构包含泛型和嵌套可以不看
static class Result<T> {
List<T> data;
public List<T> getData() {
return data;
}
public void setData(List<T> data) {
this.data = data;
}
}
static class Classes {
private String id;
private String name;
private List<Student<QianBao>> students;
public List<Student<QianBao>> getStudents() {
return students;
}
public void setStudents(List<Student<QianBao>> students) {
this.students = students;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
public void setId(String id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
}
static class QianBao{
private String qId;
private String qn;
public String getqId() {
return qId;
}
public void setqId(String qId) {
this.qId = qId;
}
public String getQn() {
return qn;
}
public void setQn(String qn) {
this.qn = qn;
}
}
static class Student<T> {
private T data1;
public T getData1() {
return data1;
}
public void setData1(T data1) {
this.data1 = data1;
}
private String stuId;
private String stuName;
public String getStuId() {
return stuId;
}
public void setStuId(String stuId) {
this.stuId = stuId;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
}
}