【发布时间】:2015-04-22 19:25:18
【问题描述】:
我正在尝试将此字符串解析为一组有组织的函数:
var str = "a(b, c(e, f(h,i,j), g(k,l,m(o,p,q)) ), d(r,s,t))"
理想情况下,我想把它变成这样的对象:
var obj = {
func:'a',
params:[
{p:'b'},
{p: {
func:'c',
params:[
{
p:'e',
p:{
func:'f',
params:[
{p:'h'},
{p:'i'},
{p:'j'}
]
},
p:'g',
params:[
{p:'k'},
{p:'l'},
{p:{
func:'m',
params:[
{p:'o'},
{p:'p'},
{p:'q'}
]
}}
]
}
]
}},
{
p:'d',
params:[
{p:'r'},
{p:'s'},
{p:'t'}
]
}
]
}
我已经尝试了大约 8 小时的混合 str.replace() str.substring() 和 str.indexOf() 并且没有任何运气。
任何关于如何实现我的目标的帮助都会受到欢迎。
注意:函数可以采用任意数量的参数,并且不设置为 3
更新——我不再尝试进行字符串操作,而是逐个字符地处理它。创建所需的输出:
var str = "a(b, c(e, f(h,i,j), g(k,l,m(o,p,q)) ), d(r,s,t))";
str = str.replace('/ /g,""');
var strArr = str.split('');
var firstPass = "";
var final;
var buildObj = function(){
for(var i = 0; i < strArr.length; i++){
var letters = /^[0-9a-zA-Z]+$/;
if(strArr[i].match(letters)){
if(strArr[i + 1] == '('){
firstPass += '},{"func":' + '"' + strArr[i] + '"';
} else {
firstPass += '"' + strArr[i] + '"';
}
}
if(strArr[i] == '('){
firstPass += ',"params":[{"p":';
}
if(strArr[i] == ')'){
firstPass += '}],';
}
if(strArr[i] == ','){
firstPass += '},{"p":';
}
//console.log(job + '}')
}
var secondPass = firstPass;
secondPass += '}'
secondPass = secondPass.replace(/,{"p":}/g,'');
secondPass = secondPass.replace('},','');
secondPass = secondPass.replace(/],}/g,']}');
final = secondPass
console.log(final)
console.log(JSON.parse(final))
};
【问题讨论】:
-
您将不得不编写一个更复杂的解析器来解析它。通过常规语法并不能真正处理它。计算括号嵌套是主要问题。
-
是的,这是我遇到的主要问题。由于处理未知数量的参数,它变得更加困难。如果有任何想法,我会全力以赴。
-
解析是一个很大的话题,就像你在高级计算机科学中学习的一门或多门课程一样。这不是超级复杂,但涉及的东西很多。
-
你考虑过jison吗?会简单很多。
标签: javascript regex string parsing