【问题标题】:Parsing using regex in recursive functions in Javascript在 Javascript 的递归函数中使用正则表达式进行解析
【发布时间】:2016-04-04 01:57:23
【问题描述】:

我想解析一个包含短代码的字符串并将每个提取的节点推入一个数组。然而,我为此编写的递归函数永远不会终止。我在这里做错了什么?

var i = 0;
var nodes = [];
var pattern = /(\[sc_(\w+)[\s\w="_-]*\])(.*)(\[\/sc_\2\])/gi;

var extractNodes = function(str, parent) {
    var m;

    if (str.indexOf('[sc_') === -1) return;

    while ((m = pattern.exec(str)) !== null) {
        nodes.push({
            id: i,
            tag: m[2],
            children: m[3],
            parentId: parent
        });
        extractNodes(m[3], i++);
    }
}

extractNodes("[sc_div][sc_span][sc_strong]Foo[/sc_strong][/sc_span][/sc_div]", -1); 

【问题讨论】:

标签: javascript regex parsing recursion


【解决方案1】:

您的 while 循环和全局 (g 标志) RegEx 之间存在冲突。

函数的每次迭代都发送相同的str 参数。您可以通过删除 g 标志和 while 循环使 RegEx 成为非全局变量来解决此问题。

Live Demo

var i = 0;
var nodes = [];
var pattern = /(\[sc_(\w+)[\s\w="_-]*\])(.*)(\[\/sc_\2\])/i; // <-- Remove `g` flag

var extractNodes = function (str, parent) {
    var m;
    if (str.indexOf('[sc_') === -1) return;

    if ((m = pattern.exec(str)) !== null) {
        nodes.push({
            id: i,
            tag: m[2],
            children: m[3],
            parentId: parent
        });

        extractNodes(m[3], i++);
    }
}

extractNodes("[sc_div][sc_span][sc_strong]Foo[/sc_strong][/sc_span][/sc_div]", -1);
console.log(nodes);

document.body.innerHTML = '<pre>' + JSON.stringify(nodes, 0, 4) + '</pre>'; // For DEMO purpose only

控制台输出(Chrome):

[对象,对象,对象]
0:对象
孩子们:“[sc_span][sc_strong]Foo[/sc_strong][/sc_span]”
编号:0
parentId:-1
标签:“div”
__proto__: 对象
1:对象
孩子们:“[sc_strong]Foo[/sc_strong]”
编号:1
父ID:0
标签:“跨度”
__proto__: 对象
2:对象
孩子们:“Foo”
编号:2
parentId:1
标签:“强”
__proto__: 对象
长度:3
__proto__: 数组[0]

【讨论】:

  • 感谢您的回复。但是当有兄弟姐妹时,这将不起作用。想象以下输入:[sc_div][sc_span][sc_strong]Foo[/sc_strong][/sc_span][/sc_div] [sc_div][sc_span][sc_strong]Bar[/sc_strong][/sc_span][/sc_div]
  • @coder9 使用? (\[sc_(\w+)[\s\w="_-]*\])(.*?)(\[\/sc_\2\]) 制作正则表达式non-greedy
猜你喜欢
  • 1970-01-01
  • 2013-05-11
  • 2015-05-16
  • 2011-03-17
  • 2015-09-06
  • 2010-11-06
  • 2012-07-25
  • 2011-05-23
  • 2020-03-05
相关资源
最近更新 更多