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

标签 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;
}

我想做一个递归函数,用字符串替换找到的匹配项。但是后来我不确定如何按照找到它们的顺序获取数组。非常感谢任何提示。

最佳答案

你可以使用这个正则表达式

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

关于javascript - 正则表达式:如何从 javascript 中的所有匹配项创建对象数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54959296/

相关文章:

javascript - 我想在每个 'DotsDiv' 元素中添加这个 'domino' 元素

javascript - 删除括号前后的所有空格

javascript - 是否有可能在 Javascript/jQuery 中获取当前鼠标光标的大小?

javascript - 开 Jest ,用不同的参数模拟同一个函数两次

javascript - jQuery 不允许在输入字段中输入字母

javascript - 如何在 Vue JS 中设置动态样式属性

python - 向结构化numpy数组添加字段(4)

perl - 如何在 Perl 中打印多维数组的一个数组?

java - 使用破折号和单引号验证名称字符串

Javascript [\s\S]* 太贪心了