求助:为JSON中data字段下的日期生成匹配正则表达式
解决JSON中仅匹配"data"字段日期并排除"not"字段的正则问题
问题分析
你当前使用的正则(?>data)*([0-9\-ZT:]{5,25}Z)存在两个核心问题:
- 仅模糊关联"data"关键词,未限定匹配范围是在
"data"字段对应的数组内部,会误匹配"not"字段里的日期 - 日期匹配规则过于宽泛,
[0-9\-ZT:]{5,25}Z可能捕获到非标准日期的无效字符串
解决方案
以下正则可以精准匹配"data"数组内的所有ISO格式日期,同时完全排除"not"字段下的日期:
(?<=("data":\[|\G)(?:[^"]*?"[^"]*?",?\s*)*")([0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z)(?="(?:,?\s*(?!"not":))*?\])
正则逻辑解释
- 前置定位:
(?<=("data":\[|\G)(?:[^"]*?"[^"]*?",?\s*)*")- 确保匹配位置要么是
"data":["的起始位置,要么是上一个日期匹配的结尾(\G),严格限定在"data"数组的范围内
- 确保匹配位置要么是
- 日期捕获:
([0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z)- 精确匹配标准ISO 8601格式的日期字符串,避免无效匹配
- 后置排除:
(?="(?:,?\s*(?!"not":))*?\])- 断言后续内容直到数组闭合
]前,不会出现"not":字段,彻底排除"not"数组内的日期
- 断言后续内容直到数组闭合
注意事项
- 该正则基于你提供的JSON结构编写,若后续JSON格式发生变化(比如
"data"数组后不是直接跟{"not"),需要调整后置断言部分 - 从严谨性来说,正则并非处理JSON的最优方案,优先推荐使用JSON解析工具提取字段;但针对性能脚本生成的场景,此正则可以满足需求
内容的提问来源于stack exchange,提问作者Анастасия Давыденко
相关产品推荐
相关产品推荐

