使用if/then进行正则表达式预测非捕获

dan*_*gom 6 regex perl json

我有一些我想修复的损坏的JSON文件.问题是其中一个字段AcquisitionDateTime格式不正确:

{
    "AcquisitionDateTime": 2016-04-28T17:09:39.515625,
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是将值包装在括号内.我可以用正则表达式轻松地做到这一点:

perl -pi -e 's/\"AcqDateTime\": (.*),/\"AcqDateTime\": \"\1\",/g' t.json
Run Code Online (Sandbox Code Playgroud)

现在,我想扩展正则表达式,以便在JSON没有被破坏的情况下,内容不会在""中被包装两次.我面临的问题是我不知道如何混合前瞻,if/then语句和捕获组.这是我的尝试:

Lookahead, if you find a ", then capture what is between it. Else capture everything.
perl -pi -e 's/\"AcqDateTime\": (?(?=\")\"(.*)\"|(.*)),/\"AcqDateTime:\" \"\1\",/g' t.json
Run Code Online (Sandbox Code Playgroud)

这是我有兴趣纠正的部分:

Lookahead for a \"  -> if yes, then capture without it. \"(.*)\" Else capture all (.*)
(?(?=\")\"(.*)\"|(.*)),
Run Code Online (Sandbox Code Playgroud)

有人会向我解释我做错了什么吗?

提前致谢.

ike*_*ami 3

匹配时间戳的一个好的开始是

\S+
Run Code Online (Sandbox Code Playgroud)

但这也匹配逗号,所以我们切换到

 [^\s,]+
Run Code Online (Sandbox Code Playgroud)

现在,您也想避免匹配引号。

 [^\s",]+
Run Code Online (Sandbox Code Playgroud)

这就是你所需要的。

perl -i -pe's/"AcqDateTime":\s*+\K([^\s",]+)/"$1"/g' t.json
Run Code Online (Sandbox Code Playgroud)