从子组中删除元素

时间:2018-12-29 11:00:24

标签: regex regex-group

我有以下字符串,我需要将数组中的零个元素弄成小数,出于某些原因,我必须使用正则表达式,因为我使用的脚本语言无法序列化/反序列化,所以我只有一个正则表达式引擎。

字符串:

{
   "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

1 个答案:

答案 0 :(得分:2)

由于您将正则表达式与.NET正则表达式引擎一起使用,因此可以利用其无限长的后向模式功能。

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

请参见.NET regex demo

输出:

enter image description here

详细信息

  • (?<="admins":\s*\[[^][]*?)-由于您只想删除0子字符串后方括号内的"admins":[,因此,该正向后缀旨在检查该条件,因此当前位置必须紧随其后:
    • "admins":-文字子字符串
    • \s*-超过0个空格
    • \[-一个[字符
    • [^][]*?-除[]以外的0个或更多字符,请尽量减少
  • (?:-交替组的开始:
    • (?<=\[)-[必须紧接当前位置之前
    • 0-零
    • (?:,\s*0\b)*-重复,,零个或多个空白,0和单词边界的零次或多次重复
    • ,?-可选逗号
  • |-或
    • \s*,\s*-用可选的0+空格括起来的逗号
    • 0-零
    • \b-单词边界
    • \s*-超过0个空格
  • )-轮换组的结尾

该替换组对于区分括号括起来的子字符串开头的零和后面的零是必要的,以便始终删除逗号和空格。