正则表达式
匹配JSON 字段的字段值的正则表达式
在这里写一个小例子
String json = "{\"name\":\"Tom\",\"px\":\"abcdefg11111111111111111111111111\"}";
String pattern = "(?=.{10,})(:\\s*\\\".+?\\\")";
json = json.replaceAll(pattern, ":\"*\"");
System.out.println(json);执行结果
{"name":"*","px":"*"}
怎么回事?和预想不一致,看来事情并不那样的简单,查一下?=的用法,现在这种写法相当来说是两个正则的逻辑与, .{10,}是匹配了一行超过10个字符,而(:\s*".+?")则匹配了json的值项目,也就是说只要这一行超过了10个字符,那么其中的json值都会被替换。知道了原因我们就好办了。把两个正则合为一个正则不就OK了吗。
我们改善以下上面的例子,
String json = "{\"name\":\"Tom\",\"px\":\"abcdefg11111111111111111111111111\"}";
String pattern = "(:\\s*\\\".{10,}?\\\")";
json = json.replaceAll(pattern, ":\"*\"");
System.out.println(json);执行结果
{"name":"*"abcdefg11111111111111111111111111"}
阿来,怎么会这样。他竟然匹配到了。。。
{“name”:“Tom”,“px”:“abcdefg11111111111111111111111111”}
随然还是不对,但离胜利只差一步了,我们在匹配中用的是.{10,},可以匹配任何字符,因此才会造成这种问题,那么我们把正常值中不应该出现的字符排除掉不就可以了吗。
String json = "{\"name\":\"Tom\",\"px\":\"abcdefg11111111111111111111111111\"}";
String pattern = "(:\s*\"[^,\":]{10,}?\")";
json = json.replaceAll(pattern, ":\"*\"");
System.out.println(json);执行结果
{"name":"Tom","px":"*"}