javascript-正则表达式-匹配重复标签的“父母子女”关系

时间:2019-06-27 09:25:56

标签: javascript regex

我有此文字

parent( child( child_of_child(value)  ) )

和此正则表达式模式用于数学

([a-z]+\(.*\))

我使用的Javascript代码

'parent( child( child_of_child(value)  ) )'.match(/([a-z]+\(.*\))/g)

当前结果:

["parent( child( child_of_child(value)  ) )"]

预期结果:

parent: {
     m: 'parent( child( child_of_child(value)  ) )',
     child: {
        m: 'child( child_of_child(value)  )',
        child: {
            m: 'child_of_child(value)'
        }
     }
}

任何对方向的帮助都将受到欢迎

3 个答案:

答案 0 :(得分:1)

尝试改用此正则表达式

let regexp = /([a-z]+)(\(.*\))/;
let text = 'parent( child( child_of_child(value)  ) )';
let match = text.match(regex);

会产生

0: "parent( child( child_of_child(value)  ) )"
1: "parent"
2: "( child( child_of_child(value)  ) )"

我们的正则表达式之间的区别是用于捕获组的括号。

这不是您想要的输出,但是转换将非常容易。

答案 1 :(得分:1)

您可能会使用递归函数和具有4个捕获组的模式,在这些捕获组中,您需要从开头到结尾的括号进行匹配。

然后在下一次迭代中检查模式是否仍然匹配。在下一个调用中,使用组使用键和值构造对象。

([^()]+)(\()(.*)(\))
  • ([^()]+)组1,捕获1次以上,而不是()
  • (\()第2组,捕获(
  • (.*)第3组,捕获除换行符外的所有字符0次以上
  • (\))第4组,捕获)

Regex demo

let pattern = /([^()]+)(\()(.*)(\))/;
let string = "parent( child( child_of_child(value)  ) )";

function parse(str, obj) {
  if (pattern.test(str)) {
    let res = str.match(pattern);
    res.shift();
    parse(res[2], obj[res[0]] = {
      'm': res.join('')
    });
  }
  return obj;
}

console.log(JSON.stringify(parse(string, {}), null, 2));

答案 2 :(得分:0)

感谢farvilain的指导,我提出了解决方案。

正则表达式更改为:

/([a-z\_]+)\((.*)\)/

我用“替换”代替“匹配”

事情就这样了:

var explore_parent_child = (val, reg) => {
var v = val.replace(reg, (a, b, c) => {

    var res = {};
    var exp = explore_parent_child(c, reg);
    if(typeof(exp) == 'object') {
        exp.m = a;
        res[b] = exp;
    } else{
        res[b] = {
            m: a,
            child: exp
        };
    }

    return JSON.stringify(res);
})

try { return JSON.parse(v) } catch { return v };}

示例运行:

explore_parent_child("parent( child( child_of_child(value)  ) )", /([a-z\_]+)\((.*)\)/)

结果:

parent: {
 m: 'parent( child( child_of_child(value)  ) )',
 child: {
    m: 'child( child_of_child(value)  )',
    child_of_child: {
        m: 'child_of_child(value)',
        value: 'value'
    }
 } }