Javascript разделить строку в словарь массива (ключ -> значение) (регулярное выражение) - PullRequest
0 голосов
/ 02 мая 2018

Цель состоит в том, чтобы разобрать строку в словарь массива в javascript.

Например, это может быть строка, которую нужно проанализировать

"к = 23: 3/24: 32b = 43: 532: 45/3: 3253"


Я бы хотел, чтобы эта строка превратилась в словарь, подобный этому (Key - Value)

k - 23: 3/24: 32

b - 43: 532: 45/3: 3253


Моей первоначальной идеей было найти [a-Z] \ *. * И разбить его на совпадения с помощью регулярных выражений.

Однако я не думаю, что это сработает, поскольку это также приведет к b , что не то, что я хочу. Кроме того, я не смог заставить это работать (я новичок в регулярных выражениях).


Равенство всегда будет только между ключом и переменной (никогда в значении). Ключ также всегда будет одним символом, а не словом.

var test = "k=23:3/24:32b=43:532:45/3:3253";
var r = /(.*)([a-Z])(//*)(*.)/

Выше была моя идея, но я не могу заставить что-то работать.

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Поскольку идентификатор состоит только из одного символа, а = - это место, где заканчивается идентификатор и начинается значение, просто сделайте это с помощью регулярного выражения, например:

var r = /.=.+?(?=(.=)|$)/g;

Что означает:

.          : a character
=          : followed by =
.+?        : followed by a bunch of characters (the ? means non-greedy mode: match as few as possible so that it won't consume from other variables)
(?=(.=)|$) : positive look-ahead, means that the above should be followed either by another .= (a character that is followed by =) or the end of the string

Затем вы можете reduce совпадений получить желаемый объект, split используя каждое совпадение для получения пар ключ-значение:

var obj = test.match(r).reduce(function(obj, match) {
    var keyValue = match.split("=");
    obj[keyValue[0]] = keyValue[1];
    return obj;
}, {});

Пример:

var test = "k=23:3/24:32b=43:532:45/3:3253";
var r = /.=.+?(?=(.=)|$)/g;

var obj = test.match(r).reduce(function(obj, match) {
    var keyValue = match.split("=");
    obj[keyValue[0]] = keyValue[1];
    return obj;
}, {});

console.log(obj);
0 голосов
/ 02 мая 2018

Возможно использовать /.=[^=]+(?!=)/g для сопоставления пары ключ-значение без дальнейшего знания того, какие символы возможны для ключа и значения:

  • Здесь .= соответствует клавише (один символ) прямо перед знаком равенства;
  • [^=]+(?!=) соответствует всем не = символам после до одного символа перед следующим знаком равенства (ограничьте жадное совпадение, используя отрицательный взгляд вперед) или конец строки;

var test = "k=23:3/24:32b=43:532:45/3:3253";

var result = {}

test.match(/.=[^=]+(?!=)/g).forEach(
  m => {
    var [k, v] = m.split('=')
    result[k] = v
  }
)

console.log(result)
...