You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调整正则表达式捕获嵌套结构的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 03:35:45