Redshift中如何用单个正则匹配倒数第二个}并修复截断JSON
用单个正则表达式在Redshift SQL中修复截断的JSON
问题场景
API返回的JSON经常会因为字符长度限制被截断,我们需要保留到倒数第二个}为止的内容,删掉后面的所有无效字符,让JSON恢复合法格式。举个例子:
截断的输入
{"date": "2004", "day": 0, "count": 0, "stage": "arst"}, {"date": "2004", "day": 1, "count": 0, "stage": "oien"}, {"date": "2005
期望的合法输出
{"date": "2004", "day": 0, "count": 0, "stage": "arst"}
之前要三次调用regexp_replace才能搞定,现在可以用单个正则表达式一步完成。
解决方案
直接用下面的Redshift SQL语句就能实现:
SELECT regexp_replace( your_json_column, '^(.*\})(?:.*\})?.*$', '\1' ) AS fixed_json FROM your_table;
正则逻辑拆解
^:锁定字符串开头,防止从中间匹配(.*\}):核心捕获组,用贪婪匹配的方式,把从开头到**倒数第二个}**的所有内容抓下来存好——.*会尽可能多匹配字符,直到碰到倒数第二个}就停止,这部分就是我们要保留的合法JSON(?:.*\})?:临时非捕获组,用来匹配最后那个完整的JSON对象(如果有的话),加个?是为了兼容输入本身只有一个完整JSON的情况.*$:把最后一个}之后的所有截断垃圾内容全匹配上- 替换时只取第一个捕获组的内容
\1,相当于直接砍掉后面的无效部分,只留合法的JSON片段
内容的提问来源于stack exchange,提问作者prayner
相关产品推荐
相关产品推荐

