首页 > 解决方案 > 正则表达式提取 Json 属性名称

问题描述

我正在寻找提取 Json 字符串的所有属性名称。我提出了一个表达式,但它不适用于某些特定场景,我构建的表达式如下

"([a-zA-Z0-9-]*)"(?::\s(?:"[a-zA-Z0-9-\s:]*")|(?:\s^null$)|(?:\s[0-9]+,))

它适用于以下属性:

{"dataAreaId": "cel",    "CustomerAccount": "C101112",    "AddressBrazilianCNPJOrCPF": "",    "PartyType": "Organization"}

但它不检索/匹配这些属性:

{ "DeliveryAddressLongitude": 0,"AddressTimeZone": null,"FullPrimaryAddress": "7800 Avenue Aurtweuil Suite 28841\nBrossard QC J2Z 3P1\nCanada"}

在我苦苦挣扎时,我将非常感谢有任何关于它的指导方针。

干杯

文森特

标签: regextextscreen-scrapingtext-extraction

解决方案


使用生成的 json,您只需要匹配冒号前面的单词,对吧,同时考虑引号?例如:

/("?)(\b\w+\b)\1:/gm

编辑:

  • /.../gm: gandm是修改表达式行为的标志,其中 g(全局)表示尝试在字符串中查找所有匹配项,m(多行)表示使字符串中的每一行都可以通过^and$锚定;你实际上不需要m这里的标志,这是我的疏忽。根据正则表达式的风格,您将使用如上所示的标志 - 在第二个表达式分隔符之后,作为匹配函数的参数或作为表达式修饰符,如(?g). 我只是找到/.../flags了一个很好的快捷方式来显示带有标志的表达式。
  • \b是一个单词边界,它通过确保单词字符的两侧不能有单词字符来锚定单词字符序列;如果存在,则表达式将不匹配。在这个表达式中,我只是使用它来使引擎更快地失败坏字符串,同时考虑可选的". 当您仅在格式良好的 JSON 上使用此表达式时,它们并不是严格需要的。

推荐阅读