【问题标题】:Get all instances of text in curly braces between brackets获取括号之间大括号中的所有文本实例
【发布时间】: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


【解决方案1】:

您的任务可以使用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"
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    相关资源
    最近更新 更多