Regex: Как создать массив объектов из всех совпадений в JavaScript? - PullRequest
0 голосов
/ 02 марта 2019

Я пытаюсь получить строковый ввод, подобный этому:

{p}This is a paragraph{/p} {img}(path/to/image) {p}Another paragraph{/p}

Чтобы вернуть массив объектов, подобных этому

[
  {"txt" : "This is a paragraph" },
  {"img" : "path/to/image"},
  {"txt" : "Another paragraph"}
]

Мне нужно, чтобы массив был проиндексированв порядке их нахождения - т.е. в приведенном выше примере первый абзац получает индекс 0, изображение получает индекс 1 и так далее.

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

var p = /{p}(.*){\/p}/gmi;
var i = /{img}\((.*)\)/gmi;

var test = "{p} This is a paragraph {/p} {img}(text)";


function returnJson(test) {
  var ps = p.exec(test);
  var im = i.exec(test)
  var arr = [];
  if (ps.length > 1) {
    arr.push({"txt" : ps[1]})
  } 
  if (im.length > 1) {
    arr.push({"img" : im[1]})
  }
  return arr;
}

Я думал о выполнении рекурсивной функции, где я заменяю найденные совпадения на строку.Но тогда я не уверен, как получить массив в том порядке, в котором они были найдены.Любые советы с благодарностью.

1 Ответ

0 голосов
/ 02 марта 2019

Вы можете использовать это регулярное выражение

/{(\w+)}([^{]+)(?:{\/\1})?/g

и создать массив, используя exec, например:

let str = "{p}This is a paragraph{/p} {img}(path/to/image) {p}Another paragraph{/p}";

let regex = /{(\w+)}([^{]+)(?:{\/\1})?/g;
let match;
let matches = [];

while (match = regex.exec(str)) {
    if(match[1] == "p")
      matches.push({ txt: match[2] })
    else
      matches.push({ [match[1]]: match[2]})
}

console.log(matches)
  • {(\w+)} возвращает имя тега в группу захвата
  • ([^{]+) получает содержимое в другую группу захвата
  • (?:{\/\1})? опционально соответствует закрывающему тегу.(\1 относится к первой группе захвата)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...