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

1

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

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

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


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

k - 23: 3/24: 32

b - 43: 532: 45/3: 3253


Моя первоначальная идея заключалась в том, чтобы искать [aZ]\*. * И разбивать его на совпадения с помощью regex.

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


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

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

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

  • 1
    Если формат значения также хорошо определен, он может сделать более чистое регулярное выражение. Похоже, что значение всегда (digits):(digits)/(digits):(digits) - так ли это?
Теги:
pattern-matching
dictionary

2 ответа

2
Лучший ответ

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

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

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)
  • 0
    Работает спасибо, как бы поменять = на *
  • 0
    Вы имеете в виду * качестве разделителя для пар ключ-значение? Если это так, попробуйте /.\*[^*]+(?!\*)/g , обратите внимание, что вам нужно экранировать * поскольку это квантификатор в регулярном выражении.
0

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

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);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню