从子组中删除元素

Remove elements from a subgroup

我有以下字符串,我需要清理数组中的零元素,由于某些原因我必须使用正则表达式,因为我使用的脚本语言不能 serialize/deserialize 我只有正则表达式引擎。

字符串:

{
   "admins": [0, 148, 10, 0, 0, 0, 0, 0, 0, 0, 0],
   "auth": "30639096bfe4ec4b9f17696ef1d02b9a",
}

并输出如下字符串:

{
   "admins": [148],
   "auth": "30639096bfe4ec4b9f17696ef1d02b9a",
}

或者最终,如果全为零:

{
   "admins": [],
   "auth": "30639096bfe4ec4b9f17696ef1d02b9a",
}

目前我的模式是:

(?<=admins":[[:space:]]\[)(.*(,[[:space:]]0))(?=\])

我找不到正确的删除子组数据的方法,其实我在这里:https://regex101.com/r/4yRSCn/1

由于您使用的是带有 .NET 正则表达式引擎的正则表达式,因此您可以利用其无限长度的后视模式功能。

(?<="admins":\s*\[[^][]*?)(?:(?<=\[)0(?:,\s*0\b)*,?|\s*,\s*0\b\s*)

参见.NET regex demo

输出:

详情

  • (?<="admins":\s*\[[^][]*?) - 因为你只想删除 "admins":[ 子串后方括号内的 0s,这个正后向是为了检查那个条件,当前位置必须立即前面有:
    • "admins": - 文字子串
    • \s* - 0+ 个空格
    • \[ - 一个 [ 字符
    • [^][]*? - 除了 [] 之外的 0 个或更多字符,尽可能少
  • (?: - 交替组的开始:
    • (?<=\[) - [ 必须紧接在当前位置
    • 之前
    • 0 - 零
    • (?:,\s*0\b)* - ,、0+ 个空格、0 和单词边界
    • 的零次或多次重复
    • ,? - 一个可选的逗号
  • | - 或者
    • \s*,\s* - 用可选的 0+ 个空格括起来的逗号
    • 0 - 零
    • \b - 单词边界
    • \s* - 0+ 个空格
  • ) - 交替组结束

这个交替组是区分括号子字符串开头的零和后面的零所必需的,以便一致地删除逗号和空格。