如何用正则替换JSON文件中的Date对象为格式化日期字符串?
用正则替换批量处理JSON中的Date对象(大文件友好)
嘿,这个需求太贴合实际了——处理大JSON文件时确实没法直接把整个文件加载成对象,正则替换是高效又省心的方案。我来给你拆解实现思路和具体操作:
核心思路分析
首先看你的目标转换:
原格式:
"insertedAt": { "$date": "2018-01-31T11:05:39.447Z" }
目标格式:"insertedAt": "2018-01-31 11:05:39.447000"
我们需要做两件事:
- 精准匹配JSON中所有
"键名": { "$date": "日期字符串" }的结构 - 把捕获到的日期字符串格式化为
YYYY-MM-DD HH:MM:SS.ffffff的形式
正则匹配规则(兼容空格变化)
JSON里可能存在任意空格(比如键和冒号之间、大括号内部),所以正则要考虑这些可变空格:
"(\w+)":\s*\{\s*"\$date":\s*"([^"]+)"\s*\}
(\w+):捕获键名(比如insertedAt)\s*:匹配任意数量的空格(包括0个)"\$date"::匹配固定的"$date"键(注意转义$)([^"]+):捕获引号内的完整日期字符串(比如2018-01-31T11:05:39.447Z)
日期字符串格式化逻辑
对捕获到的日期字符串(第二个分组),需要三步处理:
- 把
T替换为空格 - 去掉末尾的
Z - 把毫秒部分补全到6位(比如
.447→.447000)
分工具实现方案
1. Python(最灵活,适合复杂场景)
用Python逐行处理大文件,避免加载整个文件到内存,同时用回调函数处理日期格式化:
import re def format_date_match(match): # 取出捕获的键名和原始日期字符串 key = match.group(1) raw_date = match.group(2) # 处理日期格式:替换T为空格,移除Z,补全毫秒到6位 date_part, ms_part = raw_date.split('.') cleaned_date = date_part.replace('T', ' ') # 去掉Z并补0到6位 formatted_ms = ms_part[:-1].ljust(6, '0') return f'"{key}": "{cleaned_date}.{formatted_ms}"' # 逐行读写大文件 with open('input.json', 'r') as infile, open('output.json', 'w') as outfile: for line in infile: modified_line = re.sub(r'"(\w+)":\s*\{\s*"\$date":\s*"([^"]+)"\s*\}', format_date_match, line) outfile.write(modified_line)
2. VS Code/文本编辑器(快速手动处理)
如果只是临时处理文件,用编辑器的正则替换功能:
- 查找模式:
"(\w+)":\s*\{\s*"\$date":\s*"(.*)T(.*)\.(\d{3})Z"\s*\} - 替换模式:
"$1": "$2 $3.$4000" - 开启正则匹配(点击查找框右侧的
.*按钮),然后批量替换即可
3. Shell(sed命令,适合服务器环境)
用sed的扩展正则实现批量替换:
sed -E 's/"([^"]+)":\s*\{\s*"\$date":\s*"([^T]+)T([^.]+)\.([0-9]{3})Z"\s*\}/"\1": "\2 \3.\4000"/g' input.json > output.json
注意事项
- 先拿小部分测试:正则是基于字符串匹配,先找一小段测试确保不会误匹配其他结构
- 兼容特殊日期格式:如果遇到没有毫秒的日期(比如
2018-01-31T11:05:39Z),需要调整正则和格式化逻辑,比如补.000000 - 大文件优先逐行处理:Python和sed都是逐行读写,不会占用过多内存
内容的提问来源于stack exchange,提问作者Lorio
相关产品推荐
相关产品推荐

