【问题标题】:Regex extract Json attributes name正则表达式提取 Json 属性名称
【发布时间】:2020-03-17 20:19:11
【问题描述】:

我正在寻找提取 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"}

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

干杯

文森特

【问题讨论】:

    标签: regex text screen-scraping text-extraction


    【解决方案1】:

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

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

    编辑:

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

    【讨论】:

    • 非常感谢!像魅力一样工作。您能解释一下为什么使用工作边界 \ 以及为什么使用 /gm 吗?问候
    • @VincentDiallo-Nort 感谢您的提问。我编辑了我的答案。如果我不清楚,请再次询问。干杯。
    猜你喜欢
    • 2018-07-20
    • 2011-07-28
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多