【发布时间】:2019-03-18 20:34:06
【问题描述】:
假设我有一些这样的文字:
{
"source": "Analytics 13 {Employee_Info.acl} {Employee_Data}",
"lastRecNo": "3",
"columns": {
"ID": "numeric",
"NAME": "character",
"EFFECTIVE_DATE": "date",
"ROLE": "character"
},
"data": [{
"ID": 1,
"NAME": "Bill Smith",
"EFFECTIVE_DATE": "2018-10-01",
"ROLE": "Director {Regional},{Call Center}"
},
{
"ID": 2,
"NAME": "Ellen Jones",
"EFFECTIVE_DATE": "2018-07-01",
"ROLE": "Manager"
},
{
"ID": 3,
"NAME": "Sam Edwards",
"EFFECTIVE_DATE": "2018-09-01",
"ROLE": "Supervisor"
}]
}
我想用正则表达式匹配“数据”数组中的每个对象(包括花括号)。
所以第一个匹配是:
{
"ID": 1,
"NAME": "Bill Smith",
"EFFECTIVE_DATE": "2018-10-01",
"ROLE": "Director {Regional},{Call Center}"
}
第二个是:
{
"ID": 2,
"NAME": "Ellen Jones",
"EFFECTIVE_DATE": "2018-07-01",
"ROLE": "Manager"
}
第三个是
{
"ID": 3,
"NAME": "Sam Edwards",
"EFFECTIVE_DATE": "2018-09-01",
"ROLE": "Supervisor"
}
我会在 PowerShell 中使用什么正则表达式模式来做到这一点?
请注意,第一个匹配项实际上在“ROLE”字段的文本中有一些额外的花括号,它们不应干扰匹配。
到目前为止,我已经尝试过 '(?<={).*?(?=})',但第一个匹配项是:
"source": "Analytics 13 {Employee_Info.acl
此结果不是“数据”数组的一部分,并且不包括匹配中的花括号。我知道我遗漏了一些内容,上面写着“确保我们在括号/“数据”数组内,而且我可能没有考虑到“数据”第一个对象的“角色”字段中的额外花括号我想忽略的数组。
【问题讨论】:
-
为什么要用正则表达式解析 JSON?
$thatString | convertfrom-json |% data | converto-json -
因为你在图层中有括号。你可以做一个foreach。如果它有一个左括号,则添加一个变量。如果为 1 或更大,则记录每一后续行。如果它达到 2 并且你找到了一个正确的 backet,那么它就会递减到 1。等等......当它为 0 时,前面的行都作为 1 个对象添加到数组中。等等。换一种说法。在左括号上增加一个变量并开始将每一行保存到一个唯一的数组中。右括号递减。当它达到零时,将唯一数组添加到最终数组中。
标签: regex powershell