PCRE-仅当符合条件的情况下才匹配每个 重要说明目标约束我的尝试

问题描述

我正在努力解决这个问题。我需要匹配每次出现的id,以便下一个array必须为空(即[])。

{
    "objs":[
        {
            "id":73642,"henro":null,"oo":0,"array":["boxed"],"hehe":"haha"
        },{
            "holy":"guacamole","id":"pick me!","meow":"rrrraawwrr","oo":null,"array":[],"say":"what"
        },{
            "not id":null,"null":null,"id":"don't pick me","henro":3781237,"2173881":"henro","oo":"hehe","array":["baz"]
        },{
            "id":"pick me 2!","ola":"elo"
        }
    ]
}

重要说明

我已经格式化数据以使其可读。请改用精简版(悬停):

{"objs":[{"id":73642,"hehe":"haha"},{"holy":"guacamole","say":"what"},{"not id":null,"array":["baz"]},{"id":"pick me 2!","ola":"elo"}]}


目标

必须匹配id后跟"array":[]的所有值。因此,在该示例中,唯一有效的匹配项是"pick me!""pick me 2!"。两者都必须匹配(全局模式)。


约束

  • id之前总是有一个array
  • id和下一个array之间,可以有任意数量的"attribute":<value>对。
  • id的值不能包含在{}[]中。
  • 保证id的值不包含任何,字符。末尾的,字符,例如"id":73642,不能作为值的一部分,因为它用作分隔符。
  • 正则表达式只能是PCRE。
  • 这并不是真正的约束,但我更喜欢可以here确认的解决方案。

我的尝试

"id":([^,]+).*?"array":\[(?(?=])]|\K)

我天真地以为\K也会重置捕获组,但不会重置,因为id的正则表达式matches all

解决方法

考虑到所有约束,您可能会使用的最近似正则表达式为

"id":"([^,]+)[^][]*?"array":\[]

请参见this regex demo

详细信息

  • "id":"-文字"id":"字符串
  • ([^,]+)-组1:除逗号以外的任何一个或多个字符
  • [^][]*?-除[]以外的任何0个或多个字符,并且尽可能少
  • "array":\[]-文字"array":[]字符串。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...