如何调整正则表达式捕获嵌套结构的definition对应内容?
Log4j脱敏正则表达式调整方案
需求背景
要对Log4j输出的JSON日志中"definition"字段对应的嵌套内容做脱敏,目标是准确捕获该字段下的完整JSON结构(不管嵌套层级多少),再对指定字段(比如column_a的description)替换为*** REDACTED ***。
示例输入
"definition":{"schema":{"columns":[{"dataType":"INT","name":"column_a","description":"description1"},{"dataType":"INT","name":"column_b","description":"description2"}]}}}, "some other stuff": ["SOME_STUFF"], etc.
期望捕获并处理后的片段
{"schema":{"columns":[{"dataType":"INT","name":"column_a","description":"*** REDACTED ***"},{"dataType":"INT","name":"column_b","description":"description2"}]}}}
原正则的问题
你当前用的正则(?<=("definition":{))(\.|[^\])*?(?=}})依赖固定的}}作为结束标记,一旦definition内部有多层嵌套的大括号,就会提前终止匹配,没法覆盖完整的嵌套结构。
调整后的正则(支持嵌套匹配)
因为Log4j基于Java,而Java正则支持递归匹配(平衡组),可以用下面的正则来精准捕获"definition":{之后的完整嵌套内容:
(?<="definition":{)(?:[^{}]|(?R))*}(?=})
正则解释
(?<="definition":{):定位到"definition":{之后的起始位置,不捕获这段前缀(?:[^{}]|(?R))*:核心匹配逻辑——要么匹配非大括号的普通字符,要么递归匹配整个正则表达式(处理嵌套的大括号结构),确保覆盖所有层级的嵌套内容}(?=}):匹配外层的闭合大括号,后面跟着的}对应原JSON中definition对象的结尾边界
额外建议
如果场景允许,优先用JSON解析库(比如Jackson)处理日志内容,正则处理JSON在复杂场景下(比如字符串含转义字符、异常格式)容易出错。但如果必须在Log4j配置中用正则替换,上面的递归正则就能解决嵌套层级不固定的问题。
内容的提问来源于stack exchange,提问作者user10076743
相关产品推荐
相关产品推荐

