正则表达式:如何从javascript中的所有匹配项创建对象数组?

时间:2019-03-02 13:57:59

标签: javascript arrays regex sorting

我正在尝试获取这样的字符串输入:

{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 :(得分:3)

您可以使用此正则表达式

/{(\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是第一个捕获组)