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

Цель состоит в том, чтобы преобразовать строку в словарь массива в 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])(//*)(*.)/

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

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

Stephen P 02.05.2018 01:16
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
2 623
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

Psidom 02.05.2018 01:40

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

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

Другие вопросы по теме