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

时间:2016-12-21 16:27:08

标签: json regex perl

我想要修复一些损坏的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

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

提前致谢。

2 个答案:

答案 0 :(得分:3)

匹配时间戳的良好开端是

{{..}}

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

\S+

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

 [^\s,]+

这就是你所需要的一切。

 [^\s",]+

答案 1 :(得分:2)

以下正则表达式包括检查部分报价(即仅在值的开头或结尾处),两端缺少包装或空值:

documentParser

perl -pi -e 's/\"AcqDateTime\": (|(?<!\")[^\"].*|.*[^\"](?!\")),/\"AcqDateTime\": \"\1\",/g' t.json 包括:

  • 一个空字符串值,如(|(?<!\")[^\"].*|.*[^\"](?!\"))
  • 的情况
  • { "AcquisitionDateTime": }:一个不以引号开头的值,如(?<!\")[^\"].*
  • { "AcquisitionDateTime": 2016" }:一个不以引号结尾的值,如.*[^\"](?!\")中所示。