Javascript регулярное выражение без жадности с глобальным не работает - PullRequest
0 голосов
/ 23 января 2020

Я пытался избавиться от пустых групп атрибутов из следующей строки.

var str = '{"groups":[{"groupId":"03V5DCC","attributes":{}},{"groupId":"02VXTCB","attributes":{"registrationId":"550049390"}},{"groupId":"W3UV5SD","attributes":{}},],"status":{"code":200,"messageResource":"string-serverres-success"}}';

// tried with g and without g 
console.log(str.replace(/\{"groupId":".*?","attributes":\{\}\},/g,''));
// Output: "{"groups":[],"status":{"code":200,"messageResource":"string-serverres-success"}}"

console.log(str.replace(/\{"groupId":".*?","attributes":\{\}\},/,''));
// Output: "{"groups":[{"groupId":"02VXTCB","attributes":{"registrationId":"550049390"}},{"groupId":"W3UV5SD","attributes":{}},],"status":{"code":200,"messageResource":"string-serverres-success"}}"
.as-console-wrapper {
    max-height: 100% !important;
}

Один с глобальным становится жадным и удаляет группы даже с атрибутом, а другой без g просто удаляет первое совпадение. Поскольку JSON довольно большой по размеру (~ 10 МБ), для меня не вариант перед уменьшением размера строки.

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Вы можете удалить свойства как , который вы анализируете, если вы используете необязательный параметр reviver JSON .parse . Это функция, которая будет работать с каждой парой ключ-значение и может изменять или отбрасывать значения в процессе работы алгоритма синтаксического анализа. Таким образом, вы можете наблюдать за ключами attributes и , чтобы проверить, является ли значение пустым объектом . Если это так, верните undefined из reviver, и эта пара ключ-значение будет отброшена. В противном случае просто действуйте как обычно:

var str = '{"groups":[{"groupId":"03V5DCC","attributes":{}},{"groupId":"02VXTCB","attributes":{"registrationId":"550049390"}},{"groupId":"W3UV5SD","attributes":{}}],"status":{"code":200,"messageResource":"string-serverres-success"}}';


var obj = JSON.parse(str, function (key, value) {

    //if the key is `attribute` and the value is empty, then drop it
    if (key === "attributes" && isEmpty(value)) 
      return undefined;

    //just return the value
    return value;
  }
)

//sample implementation of a check for empty objects
function isEmpty(obj) {
  return Object.keys(obj).length === 0;
}

console.log(obj);
0 голосов
/ 23 января 2020

Нежадный .*? на самом деле не жадный, но он будет потреблять символы, пока все, что следует, не совпадет. Таким образом, если есть группа с непустыми атрибутами, то не удовлетворяет совпадению, поэтому .*? будет продолжать «есть» символы в строке, пока не найдет совпадение.

Как уже отмечали другие, не делайте так. Разобрать строку как JSON и затем оперировать самой структурой данных. Если после этого вам понадобится JSON, повторно сериализуйте его с JSON.stringify().

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