Регулярное выражение для подстроки на NodeJS с помощью пинч. js - PullRequest
1 голос
/ 14 февраля 2020

Я изменяю JSON файлы / Javascript объект, используя библиотеку Pinch: https://github.com/Baggz/Pinch

В этом примере pinch() с параметром регулярного выражения /id/ изменяет ВСЕ значения идентификатора 321.

Я хочу изменить значение всех идентификаторов, но только для указанного c «Запросчика» на основе параметра (requestorToChange). Допустим, «RequestorX». Как мне написать регулярное выражение для этого?

var sample = {
  "RequestorX":
  [{
    user: {
      id: '123'
    },
    request: {
      id: '456'
    },
    book: {
      id: '789'
    }
  }],
  "RequestorY":
  [{
    user: {
      id: '111'
    },
    request: {
      id: '222'
    },
    book: {
      id: '333'
    }
  }]
};

const requestorToChange = 'RequestorX'

pinch(sample, /id/, function(path, key, value) {
  return '321';
});

console.log(JSON.stringify(sample))

Я знаю, что один из вариантов - просто сделать:

pinch(sample['RequestorX'], /id/, function(path, key, value) {
  return '321';
});

Но я должен быть в состоянии сделать это через поле регулярных выражений, поскольку в действительности я буду манипулировать глубоко вложенные JSON файлы.

1 Ответ

0 голосов
/ 14 февраля 2020

Объяснение на странице GitHub немного скудно, но в основном вы начинаете со стиля замены точечной нотации и заменяете переменные части шаблонами регулярных выражений, придерживаясь правил JS регулярных выражений.

Таким образом, в вашем случае шаблон точечной нотации 'RequestorX[0].user.id'
становится регулярным выражением типа /RequestorX\[0\]\.(user|request|book)\.id/

Некоторые примечания:

  • сначала мы должны выйти из квадратных скобок, потому что они имеют особое значение в регулярном выражении
  • далее, мы также должны избегать. чтобы использовать его как символ точечной нотации
  • мы используем группу с чередованиями для замены идентификатора на всех них
  • Я пытался использовать new RegExp вместо нотации /../ чтобы создать объект регулярного выражения для добавления вашей константы в шаблон, к сожалению, в этом случае заменяется только первый элемент, вероятно, ошибка ...

    pinch(sample, new RegExp(requestorToChange +'\[0\]\.(user|request|book)\.id'), '321');
    

Пример кода (SO фрагмент кода выводит некоторые дополнительные сообщения sh о RequestorY, игнорируйте его)

var sample = {
  "RequestorX": [
    {
      "user": {
        "id": "123"
      },
      "request": {
        "id": "456"
      },
      "book": {
        "id": "789"
      }
    }
  ],
  "RequestorY": [
    {
      "user": {
        "id": "123"
      },
      "request": {
        "id": "456"
      },
      "book": {
        "id": "789"
      }
    }
  ]
}

const requestorToChange = 'RequestorX';
//var result = pinch(sample, 'RequestorX[0].user.id', '321'); //replace the user id of RequestorX with dot notation
var result = pinch(sample, /RequestorX\[0\]\.(user|request|book)\.id/, '321');
//var result = pinch(sample, new RegExp(requestorToChange +'\[0\]\.(user|request|book)\.id'), '321');
console.log(JSON.stringify(result));
<script src="https://cdn.jsdelivr.net/npm/pinch@0.1.3/src/pinch.js"></script>

Увы, JSON + регулярное выражение звучит немного странно, но инструмент выглядит ле git.

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