问题描述
我正在努力解决这个问题。我需要匹配每次出现的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":[]
字符串。