【问题标题】:Capture repeating elements between two words in JSON using RegEx使用 RegEx 捕获 JSON 中两个单词之间的重复元素
【发布时间】:2016-11-26 17:52:19
【问题描述】:

我有一个需要解析的 Web 服务响应,返回 JSON。我想在起始词和结束词之间捕获"id":"123-abc-345" 的所有实例。我需要知道所有 ID,以便我可以在它们之间随机选择。我必须在“关键开始词”和“关键结束词”之间查看的原因是 ID 元素出现在文档中的各个位置(甚至在开始和结束词之前),但我只对 ID 感兴趣在“开始”和“结束”之间。

我正在使用的示例数据:

[]}6778:---esghsrth"id":"95907bc09-568976456-c6a5a-4f87g"[]}6778:---AAAAA{[]}bla...esghshrth"id":"95907bc09-568976456-c6a5a-4f87g"[]}6778:---esghsrth"id":"95907bc09-568976456-c6a5a-4f87g"[]}6778:---esghsrth"id":"95907bc09-568976456-c6a5a-4f87g"[]}6778:---esghsrth"id":"95907bc09-568976456-c6a5a-4f87g"[]}6778:---esghsrth"id":"95907bc09-568976456-c6a5a-4f87g"[]}6778:---esghsrth"id":"95907bc09-568976456-c6a5a-4f87g"[]}6778:---esghsrth"id":"95907bc09-568976456-c6a5a-4f87g"[]}6778:---ZZZZZ[]}6778:---esghsrth"id":"95907bc09-568976456-c6a5a-4f87g"[]}6778:---

我已经达到了:(.*?)(\"id\":\"[^"]*)+ 它确实捕获了我感兴趣的 ID - 不幸的是我不需要的那些(在 AAAAA 之前和 ZZZZZ 之后)。

Thisthisthis 接近 - 但仍然没有雪茄。 任何帮助将不胜感激 - 指向正确方向的指针或完整的工作正则表达式(即使首选工作示例:-))

感谢正则表达式大师!

【问题讨论】:

    标签: json regex


    【解决方案1】:

    一步到位,但有点棘手 (demo):

    AAAAA(?!\"id\":\"[^"]*\").*?(\"id\":\"[^"]*\")|(?<!^)\G(?!\"id\":\"[^"]*\").*?(\"id\":\"[^"]*\")(?=.*ZZZZZ)

    简化版,其中\"id\":\"[^"]*\" 替换为id

    AAAAA(?!id).*?(id)|(?<!^)\G(?!id).*?(id)(?=.*ZZZZZ)

    灵感来自@nhahtdh explanation

    【讨论】:

    • Evgeniy - 哇。我想我需要一些时间来了解您是如何做到的;-) 实际上,一次性完成它会非常可取-这将为我省去 C 字符串操作/正则表达式 (bleh) 的麻烦-以及所有标题/库包含的东西。斯帕西巴!!!
    【解决方案2】:

    您可以首先使用(?<=AAAAA).*?(?=ZZZZZ) 捕获这两个关键字之间的所有内容,然后在结果中搜索此正则表达式(?<=\"id\":\").*?(?=\")。后者将匹配 "id":"" 之间的所有内容,不包括那些。

    【讨论】:

    • 太好了,感谢 Nicolas 的解决方案!我想我必须清理一下我的 C 字符串操作和正则表达式技能(这是为 Loadrunner 准备的……),但这会很好。再次感谢。最后一个问题 - 我不能一次将这两个步骤结合起来,对吧?
    • 我不这么认为。
    • Nicolas, Evgeniy:我认为 Evgeniy 的回答是“正确的”,因为它在我需要做的处理过程中为我省去了 很多 的麻烦。他们都工作,我非常感谢你的帮助!谢谢!
    猜你喜欢
    • 2020-06-09
    • 2018-04-29
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多