正则表达式:将重复的组与不重复的组进行匹配

时间:2018-07-04 11:16:50

标签: c# regex regex-group

我有一个Json字符串,我需要从在C#中使用Regex提取一些数据 字符串是这样的:

{
  "key1": "value1",
  "key2": "value2",
  "key3": "value3",
  "key4": [
    {
      "arrayKey1": 1,
      "arrayKey2": "something",
      "arrayKey3": "somethingelse"
    },
   {
      "arrayKey1": 2,
      "arrayKey2": "something2",
      "arrayKey3": "somethingelse2"
    },
   {
      "arrayKey1": 3,
      "arrayKey2": "something3",
      "arrayKey3": "somethingelse3"
    }
  ],
  "some very long text here": ""
  "anotherKey": "value",
  "keylast": "valuelast"
}

我想使用命名组提取数组的值,我使用以下正则表达式进行了此操作:(?:"arrayKey1": (?<arrayKey1>[^"]+),[\n\t ]+"arrayKey2": "(?<arrayKey2>[^"]+)",[\n\t ]+"arrayKey3": "(?<arrayKey3>[^"]+)")

这很好用,我得到每个匹配项,每个匹配项都有3组键。

现在,我要添加一个仅包含“ anotherKey”值的额外匹配项 我无法上班,这是我尝试过但无法正常工作的一些正则表达式:

(?:"arrayKey1": (?<arrayKey1>[^"]+),[\n\t ]+"arrayKey2": "(?<arrayKey2>[^"]+)",[\n\t ]+"arrayKey3": "(?<arrayKey3>[^"]+)")(?:[\s\S]*)(?:"anotherKey": "(?<anotherKey>[^"]+)")

这个确实获得了“ anotherKey”,但是它只返回数组中的第一项,而不是全部。

也:https://regex101.com/r/mfXlRs/1

有人可以用正确的方式让我吗?

谢谢

1 个答案:

答案 0 :(得分:0)

您的arrayKey1..3的正则表达式(仅)给出了三项独立的匹配,并且在每项中 匹配您得到3个必需值。

现在,在添加片段以寻找anotherKey之后,但在父级, 情况改变了。 现在您只有一个单个匹配项,因为:

  • 您的“旧”正则表达式仅与arraykeys的第一组匹配。
  • 然后(?:[\s\S]*)匹配所有anotherKey,包括 其余两套arraykeys
  • 添加的部分仅与anotherKey相匹配。

也许您应该分两个步骤执行匹配:

  • 从第一个(旧)匹配开始,为arraykey获得3个匹配 并将它们存储在某个地方。
  • 然后进行第二场比赛,参加anotherKey

+量词添加到“旧”组中将无济于事,因为如果捕获 组被匹配了几次,则该组将仅保留最后一个匹配。