【发布时间】:2019-03-19 18:41:28
【问题描述】:
我正在尝试创建一个正则表达式模式来匹配我正在构建的一个小型应用程序的“人造”html 标签。
我创建了正则表达式来捕获在{tag}brackets{/tag} 中找到的匹配项,并将它们输出到一个对象数组中,如下所示:
{
{key : value},
{key : value}
}
当前模式的代码:
let str = "{p}This is a paragraph{/p} {img}(path/to/image) {ul}{li}This is a list item{/li}{li}Another list item{/li}{/ul}";
let regex = /\{(\w+)}(?:\()?([^\{\)]+)(?:\{\/1})?/g;
let match;
let matches = [];
while (match = regex.exec(str)) {
matches.push({ [match[1]]: match[2]})
}
console.log(matches)
我意识到我也需要该模式来捕获嵌套组,并将它们放入一个数组中——因此上述string 的结果将是:
[
{p : "This is a paragraph"},
{img : "path/to/image"},
{ul : ["This is a list item", "Another List item"]}
]
这里的想法是按顺序匹配每个标签,以便数组的索引与找到它们的顺序匹配(即上面字符串中的第一段是array[0]等等)。
如果有人对我如何构建模式有一点意见,我将不胜感激。 我不会有超过 1 级的深度嵌套,如果这有什么不同的话。
如果这会有所帮助,我可以灵活地为ul 使用不同的标记,但是我不能使用方括号[text],因为与生成我在此步骤中尝试提取的文本的另一个函数发生冲突。
编辑:一个让我印象深刻的想法是让第三个捕获组捕获并推送到列表数组,但我不确定这在现实中是否可行?到目前为止我还没有让它工作
【问题讨论】:
-
{img}没有结束标签?还是括号是分隔符? -
很好——我的错字了,我用更新的模式更新了线程。专利权是可选的捕获,如果它们存在于标签之后,那么它会捕获里面的文本
标签: javascript arrays json regex