我有此文字
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)'
}
}
}
任何对方向的帮助都将受到欢迎
答案 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组,捕获)
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'
}
} }