代码之家  ›  专栏  ›  技术社区  ›  Irvin Dominin

从子组中删除元素

  •  -1
  • Irvin Dominin  · 技术社区  · 7 年前

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

    {
       "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 回复  |  直到 7 年前
        1
  •  2
  •   Wiktor Stribiżew    7 年前

    由于您使用的是带有.NET正则表达式引擎的正则表达式,因此可以利用它的无限长查找模式特性。

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

    .NET regex demo .

    输出:

    enter image description here

    • (?<="admins":\s*\[[^][]*?) 0 s在后方括号内 "admins":[ 子字符串,此正向lookebhind用于检查该条件,当前位置的前面必须紧跟着:
      • "admins": -文字子串
      • \s* -0+空格
      • \[ -a [ 烧焦
      • [^][]*? [ ]
    • (?: -替代组的开始:
      • (?<=\[) -a [
      • 0 -零
      • (?:,\s*0\b)* -零次或多次重复 , 0
      • ,?
    • | -或
      • \s*,\s* -用可选的0+空格括起来的逗号
      • -零
      • \b -词界
      • \* -0+空格
    • )

    此交替组是区分括号内子字符串开头的零和后面的零所必需的,以便始终删除逗号和空格。

    推荐文章