有个需求,需要对json格式数据里面的人名(staffName)和电话(mobile进行脱敏。这种考虑用正则匹配。
处理:
正则表达式:
名字:包括英文字符,数字,空格(英文名称带空格): a-zA-Z0-9_\s
中文: \u4e00-\u9fa5
组合:([a-zA-Z0-9_\s\u4e00-\u9fa5]+)
匹配: "staffName": "李盼盼"
要注意处理 双引号
String namePattern = "([a-zA-Z0-9_\\s\\u4e00-\\u9fa5]+)";// \s* 匹配可能出现的多个空格String pattern = "\""+key+"\""+":\\s*\""+namePattern+"\"";
先匹配:
java"> public static void main(String[] args) {String data = initData().trim();matchReplaceWithCondition("staffName", data);}public static String matchReplaceWithCondition( String key,String content){String namePattern = "([a-zA-Z0-9_\\s\\u4e00-\\u9fa5]+)";// \s* 匹配可能出现的多个空格String pattern = "\""+key+"\""+":\\s*\""+namePattern+"\"";Pattern p = Pattern.compile(pattern);Matcher m = p.matcher(content);StringBuffer sb = new StringBuffer();while (m.find()) {String group = m.group();System.out.println(group);System.out.println(m.group(1));m.appendReplacement(sb, group == null ? "" : group);}m.appendTail(sb);return sb.toString();}public static String initData(){return "[{\"staffName\": \"李盼盼\",\"mobile\":\"18920220111,18955472232\"},{\"staffName\": \"Jenny Lang\",\"mobile\":\"18920220222,18920203333,18955472234\"},{\"staffName\": \"张三\",\"mobile\":\"18920221711\"}]";}
这样就匹配到名字了
脱敏:
脱敏的话,就可以直接用replaceAll进行处理了。
java"> public static void main(String[] args) {String data = initData().trim();matchReplaceWithCondition("staffName", data);String staffName = desensitizeName("staffName", data);System.out.println(staffName);}// 名字,字符,数字,空格(英文名称带空格): a-zA-Z0-9_\s// 中文: \u4e00-\u9fa5// 组合 ([a-zA-Z0-9_\s\u4e00-\u9fa5]+)public static String desensitizeName(String key, String name) {return name.replaceAll( "\""+key+"\""+":\\s*\""+"(\\S)([a-zA-Z0-9_\\s\\u4e00-\\u9fa5]+)"+"\"", "\""+key+"\""+":\""+"$1**"+"\"");}
输出:
java">[{"staffName":"李**","mobile":"18920220111,18955472232"},{"staffName":"J**","mobile":"18920220222,18920203333,18955472234"},{"staffName":"张**","mobile":"18920221711"}]
缺陷:
对于人名的脱敏,因为有两个名字,三个名字及其更多的,replaceAll的方式,只保留第一个字,总感觉还是不直观。如果要求不高,直接用replaceAll比较方便。
总结:
正则匹配人名,主要是要了解中文的匹配。在json格式数据里面,要注意双引号的处理。