首页 > 解决方案 > JAVA:如何使用正则表达式屏蔽对象值

问题描述

我正在屏蔽发送到服务器的日志数据,我需要屏蔽 JSON 格式的特定值

"Address":{"id":"3746658","buildingHouseNumber":"5","street":"mathew rd","postTown":"asdf, sdf","postCode":"abc we32","country":{"name":"United Kingdom"}

我希望输出为:

"Address":{"id":"***","***":"***","street":"***","postTown":"***","postCode":"***","country":{"name":"***"}

我试过正则表达式:

"\"Address\":{\"(.*)\"}"

但这不能取代国内的内容,因为其中还有一个对象,并且它与县的右括号一起过早地完成。这个正则表达式应该产生如下结果:Address:{"***"}这也不是一个合法的 JSON(但可以这样生活,因为这只是在日志中。虽然如果我们可以放置一个实际的对象而不会使 JSON 损坏,那就太好了)

我还尝试了另一个正则表达式,我可以像上面想要的输出一样替换单个键的值。

"\"buildingHouseNumber\":\"([^\"]+)"

尽管存在一个问题,但此正则表达式在选择值方面效果很好,它只选择了值并忘记了buildingHouseNumber键,因此,当我在日志中进行替换时,它会用相同的值替换所有条目。例如。如果 buildingnumber 为 10,它将替换日志中所有 10 的实例。

有没有一种使用正则表达式的方法,通过它我可以实现上面粘贴的输出或输出,如:Address: {"***"}

标签: javaregex

解决方案


(:").*?" would select the values along with the semi-colon and the quotes. In Java, following would replace the values with *

String clearTextJsonString = "\"Address\":{\"id\":\"3746658\",\"buildingHouseNumber\":\"5\",\"street\":\"mathew rd\",\"postTown\":\"asdf, sdf\",\"postCode\":\"abc we32\",\"country\":{\"name\":\"United Kingdom\"}";
String maskedJsonString = clearTextJsonString.replaceAll("(:\").*?\"", ":\"***\"");

推荐阅读