我想要修复一些损坏的JSON文件。 问题是其中一个字段AcquisitionDateTime格式错误:
Index usg pre
0 2_usg 0_pre
1 0_usg 3_pre
2 0_usg 3_pre
3 2_usg 1_pre
4 1_usg 1_pre
我想要做的是将值包装在括号内。我可以用正则表达式轻松地做到这一点:
{
"AcquisitionDateTime": 2016-04-28T17:09:39.515625,
}
现在,我想扩展正则表达式,以便在JSON没有被破坏的情况下,内容不会在""中被包裹两次。我面临的问题是,我不知道如何混合前瞻,if / then语句和捕获组。这是我的尝试:
perl -pi -e 's/\"AcqDateTime\": (.*),/\"AcqDateTime\": \"\1\",/g' t.json
这是我有兴趣纠正的部分:
Lookahead, if you find a ", then capture what is between it. Else capture everything.
perl -pi -e 's/\"AcqDateTime\": (?(?=\")\"(.*)\"|(.*)),/\"AcqDateTime:\" \"\1\",/g' t.json
有人会向我解释我做错了什么吗?
提前致谢。
答案 0 :(得分:3)
匹配时间戳的良好开端是
{{..}}
但是这也与逗号匹配,所以我们切换到
\S+
现在,您也希望避免匹配引号。
[^\s,]+
这就是你所需要的一切。
[^\s",]+
答案 1 :(得分:2)
以下正则表达式包括检查部分报价(即仅在值的开头或结尾处),两端缺少包装或空值:
documentParser
perl -pi -e 's/\"AcqDateTime\": (|(?<!\")[^\"].*|.*[^\"](?!\")),/\"AcqDateTime\": \"\1\",/g' t.json
包括:
(|(?<!\")[^\"].*|.*[^\"](?!\"))
或{ "AcquisitionDateTime": }
:一个不以引号开头的值,如(?<!\")[^\"].*
或{ "AcquisitionDateTime": 2016" }
:一个不以引号结尾的值,如.*[^\"](?!\")
中所示。