Цель состоит в том, чтобы преобразовать строку в словарь массива в javascript.
Например, это может быть строка, которую нужно проанализировать
"k = 23: 3/24: 32b = 43: 532: 45/3: 3253"
Я бы хотел, чтобы эта строка превратилась в словарь вот так (Ключ - Значение)
к - 23: 3/24: 32
б - 43: 532: 45/3: 3253
Моя первоначальная идея заключалась в том, чтобы найти [a-Z] \ *. * И разбить его на совпадения с помощью регулярного выражения.
Однако я не думаю, что это сработает, поскольку это также приведет к появлению б, чего я не хочу. Кроме того, мне не удалось заставить это работать (я новичок в регулярном выражении).
Равенство всегда будет только между ключом и переменной (никогда в значении). Ключ также всегда будет только одним символом, а не словом.
var test = "k=23:3/24:32b=43:532:45/3:3253";
var r = /(.*)([a-Z])(//*)(*.)/
Выше была моя идея, но я не могу заставить что-либо работать.
Возможно, используйте /.=[^=]+(?!=)/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.info(result)
Вы имеете в виду, что у вас есть *
в качестве разделителя для пар ключ-значение? Если это так, попробуйте /.\*[^*]+(?!\*)/g
, обратите внимание, что вам нужно избежать *
, поскольку это квантификатор в регулярном выражении.
Поскольку идентификатор представляет собой только один символ, а =
- это то место, где заканчивается идентификатор и начинается значение, тогда просто сделайте это, используя регулярное выражение, например:
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.info(obj);
Если формат значения также хорошо определен, это может сделать регулярное выражение более чистым. Это выглядит, как будто значение всегда
(digits):(digits)/(digits):(digits)
- это так?