获取括号内大括号中的所有文本实例

时间:2018-10-14 04:07:01

标签: regex powershell

假设我有这样的文字:

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

我想让RegEx匹配“数据”数组中的每个对象(包括花括号)。

第一个匹配项是:

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

该结果不是“数据”数组的一部分,并且不包含大括号。我知道我缺少“确保我们在方括号/“数据”数组中”的内容,而且我可能没有考虑到“数据”第一个对象中“角色”字段中的多余花括号我想忽略的数组。

1 个答案:

答案 0 :(得分:6)

使用ConvertFrom-JsonConvertTo-Json cmdlet可以轻松完成您的任务。

这是一个简短的示例:

首先,您将文本文件内容转换为变量。

$JSON = @"
[
    {
    "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"
    }]
    }
]
"@

然后,您只需使用ConvertFrom-Json cmdlet从JSON进行转换。

ConvertFrom-Json -InputObject $JSON

输出:

source                                           lastRecNo columns                                                            data                                                                                              
------                                           --------- -------                                                            ----                                                                                              
Analytics 13 {Employee_Info.acl} {Employee_Data} 3         @{ID=numeric; NAME=character; EFFECTIVE_DATE=date; ROLE=character} {@{ID=1; NAME=Bill Smith; EFFECTIVE_DATE=2018-10-01; ROLE=Director {Regional},{Call Center}}, @...

然后,您可以使用ConvertTo-Json cmdlet将数据从DATA返回为JSON格式。在一起。

$PSObject = ConvertFrom-Json -InputObject $JSON
foreach ($item in $PSObject.data){
    ConvertTo-Json $item
}

输出:

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

您现在可以为filter conditions中的DATA项目添加foreach loop