如何通过正则表达式

时间:2016-05-04 08:48:12

标签: regex

我有下面的字符串(一个长字符串)。

  

{ “类型”: “执行”, “typeValue”: “定制”, “targetValue”: “_自”, “PARAMS”:{ “_报告”: “REPORTNAME”, “hyperlinkInput”: “2”,”组织 “:” ORGID “ ”As_Of_Date“: ”2016年4月1日“}, ”ID“: ”1111“, ”HREF“:” HREF = hyperlinkInput 2安培;组织= ORGID和放大器; As_Of_Date = 2016年4月1日和放大器;语言环境= EN_US “ ”选择器“: ”ExecutionEnd“},{ ”类型“: ”执行“, ”typeValue“: ”定制“, ”targetValue“: ”_自“, ”PARAMS“:{ ”_报告“:” REPORTNAME “ ”hyperlinkInput“: ”2“, ”组织“: ”ORGID“, ”As_Of_Date“: ”2016年4月1日“, ”客户ID“: ”2222“}, ”ID“: ”1234“,” HREF “:” HREF hyperlinkInput = 2及组织= ORGID&安培; As_Of_Date = 2016年4月1日和安培;客户id = 2222&安培;语言环境= EN_US “ ”选择器“: ”ExecutionEnd“},{ ”类型“: ”执行“,” typeValue “:” 自定义 “ ”targetValue“: ”_自我“, ”PARAMS“:{ ”_报告“: ”REPORTNAME“, ”hyperlinkInput“: ”2“, ”组织“: ”ORGID“, ”As_Of_Date“:” 2016- 04-01 “},” ID “:” 1112" , “HREF”: “HREF hyperlinkInput = 2及组织= ORGID&安培; As_Of_Date = 2016年4月1日和安培;语言环境= EN_US”, “选择器”: “ExecutionEnd”} ,{ “类型”: “执行”, “typeValue”: “定制”,“目标值 “:” _自我 “ ”PARAMS“:{ ”_报告“: ”REPORTNAME“, ”hyperlinkInput“: ”2“, ”组织“: ”ORGID“, ”As_Of_Date“: ”2016年4月1日“,” 客户ID “:” 2223 “},” ID “:” 1235" , “HREF”: “HREF hyperlinkInput = 2及组织= ORGID&安培; As_Of_Date = 2016年4月1日和安培;客户id = 22223&安培;语言环境= EN_US”, “选择器” : “ExecutionEnd”},

请注意:

  1. 字符串在一行中,您可以注意到在每个{}对中,内容非常相似。
  2. 我只能使用正则表达式,并且不能通过任何函数进行任何拆分。
  3. 我想使用正则表达式过滤掉包含最小完整长度的CustomerID的表达式。例如,我想过滤掉如下。
  4.   

    { “类型”: “执行”, “typeValue”: “定制”, “targetValue”: “_自”, “PARAMS”:{ “_报告”: “REPORTNAME”, “hyperlinkInput”: “2”,”组织 “:” ORGID “ ”As_Of_Date“: ”2016年4月1日“, ”客户ID“: ”2222“}, ”ID“: ”1234“, ”HREF“:” HREF hyperlinkInput = 2及组织= ORGID和放大器; As_Of_Date = 2016年4月1日和安培;客户id = 2222&安培;语言环境= EN_US”, “选择器”: “ExecutionEnd”}

         

    { “类型”: “执行”, “typeValue”: “定制”, “targetValue”: “_自”, “PARAMS”:{ “_报告”: “REPORTNAME”, “hyperlinkInput”: “2”,”组织 “:” ORGID “ ”As_Of_Date“: ”2016年4月1日“, ”客户ID“: ”2223“}, ”ID“: ”1235“, ”HREF“:” HREF hyperlinkInput = 2及组织= ORGID和放大器; As_Of_Date = 2016年4月1日和安培;客户id = 22223&安培;语言环境= EN_US”, “选择器”: “ExecutionEnd”},

    但我不知道该怎么做。我尝试了多次零宽度断言,但仍然无法弄明白。你能开导我吗?谢谢!

1 个答案:

答案 0 :(得分:0)

转发

由于所有可能的边缘情况,我不建议使用Regex来解析JSON。但看起来您可以控制数据,因此可以限制边缘情况。

描述

根据您的源文本,此正则表达式将执行以下操作:

  • 查找嵌套在CustomerID数组中的Params字段的所有JSON条目,并嵌入href字符串
  • 验证位于CustomerIDParams的{​​{1}}是否相同
  • 使用压缩和扩展JSON
  • 避免了正则表达式警方抱怨的一些明显边缘案件

注意:运行此正则表达式我使用了Case不敏感标记。

href

Regular expression visualization

要更好地查看图像,请右键单击图像,然后选择在新窗口中打开。

实施例

来源文字

\{(?=(?:"[^"]*"|[^{}"]*|\{[^{}]*})*?"params":\{(?:"[^"]*"|[^{}"]*|\{[^{}]*})*?"CustomerID":"([^"]*)")(?=(?:"[^"]*"|[^{}"]*|\{[^{}]*})*?"href":"[^"]*&CustomerID=\1)(?:"[^"]*"|[^{}"]*|\{[^{}]*})*}

<强>匹配

{"type":"Execution","typeValue":"Custom","targetValue":"_self","params":{"_report":"reportname","hyperlinkInput":"2","Organization":"orgid","As_Of_Date":"2016-04-01"},"id":"1111","href":"href?hyperlinkInput=2&Organization=orgid&As_Of_Date=2016-04-01&Locale=en_US","selector":"ExecutionEnd"}
,{"type":"Execution","typeValue":"Custom","targetValue":"_self","params":{"_report":"reportname","hyperlinkInput":"2","Organization":"orgid","As_Of_Date":"2016-04-01","CustomerID":"2222"},"id":"1234","href":"href?hyperlinkInput=2&Organization=orgid&As_Of_Date=2016-04-01&CustomerID=2222&Locale=en_US","selector":"ExecutionEnd"},{"type":"Execution","typeValue":"Custom","targetValue":"_self","params":{"_report":"reportname","hyperlinkInput":"2","Organization":"orgid","As_Of_Date":"2016-04-01"},"id":"1112","href":"href?hyperlinkInput=2&Organization=orgid&As_Of_Date=2016-04-01&Locale=en_US","selector":"ExecutionEnd"},{"type":"Execution","typeValue":"Custom","targetValue":"_self","params":{"_report":"reportname","hyperlinkInput":"2","Organization":"orgid","As_Of_Date":"2016-04-01","CustomerID":"2223"},"id":"1235","href":"href?hyperlinkInput=2&Organization=orgid&As_Of_Date=2016-04-01&CustomerID=22223&Locale=en_US","selector":"ExecutionEnd"},

{"type":"Execution","typeValue":"Custom","targetValue":"_self","params":{"_report":"reportname","hyperlinkInput":"2","Organization":"orgid","As_Of_Date":"2016-04-01","CustomerID":"44444"},"id":"1235","href":"href?hyperlinkInput=2&Organization=orgid&As_Of_Date=2016-04-01&CustomerID=44444&Locale=en_US","selector":"ExecutionEnd"},

解释

捕获论坛

  • 组0获取整个匹配的JSON块
  • 第1组获取与[0][0] = {"type":"Execution","typeValue":"Custom","targetValue":"_self","params":{"_report":"reportname","hyperlinkInput":"2","Organization":"orgid","As_Of_Date":"2016-04-01","CustomerID":"2222"},"id":"1234","href":"href?hyperlinkInput=2&Organization=orgid&As_Of_Date=2016-04-01&CustomerID=2222&Locale=en_US","selector":"ExecutionEnd"} [0][1] = 2222 [1][0] = {"type":"Execution","typeValue":"Custom","targetValue":"_self","params":{"_report":"reportname","hyperlinkInput":"2","Organization":"orgid","As_Of_Date":"2016-04-01","CustomerID":"44444"},"id":"1235","href":"href?hyperlinkInput=2&Organization=orgid&As_Of_Date=2016-04-01&CustomerID=44444&Locale=en_US","selector":"ExecutionEnd"} [1][1] = 44444
  • 相关联的值

<强>扩展

CustomerID