Получить все экземпляры текста в фигурных скобках между скобками - PullRequest
0 голосов
/ 14 октября 2018

Допустим, у меня есть такой текст:

{
    "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 соответствовал каждому объекту в массиве "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"
}

Какой шаблон регулярного выражения я бы использовал для этого в PowerShell?

Обратите внимание, что в первом совпадении на самом деле есть несколько фигурных скобок в тексте поля «РОЛЬ», которые не должны мешать сопоставлению.

Я уже пробовал это '(?<={).*?(?=})', но первое совпадение:

"source": "Analytics 13 {Employee_Info.acl

Этот результат не является частью массива "data" и невключить фигурные скобки в матче.Я знаю, что мне не хватает того, что говорит "убедитесь, что мы находимся внутри массива скобок /" данных ", и я, вероятно, не принимаю во внимание лишние фигурные скобки в поле" ROLE "в первом объекте" данных "массив, который я хочу игнорировать.

1 Ответ

0 голосов
/ 14 октября 2018

Ваша задача может быть легко выполнена с помощью командлетов ConvertFrom-Json и ConvertTo-Json.

Вот краткий пример:

Сначала вы получаете содержимое текстового файла в переменную.

$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"
    }]
    }
]
"@

Затем вы просто выполняете преобразование из JSON с помощью ConvertFrom-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}}, @...

Затем вы можете вернуть элементы из формата DATA в формат JSON с помощью ConvertTo-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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...