我试图用括号内的括号解析字符串。只要要解析的字符串很小,并且不必使用太多嵌套括号,一切就可以正常工作。
但是,当要解析的字符串变大时,我会不断收到类似FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
和的错误RangeError: Maximum call stack size exceeded
。
谁能告诉我如何优化/修复下面的代码,以便它可以在较大的字符串上工作而不会出现内存和堆栈大小错误?我要解析的大字符串可以在这里找到
目的是将字符串变成这样
"Alvor (Alv Alf Alvaro (Halfrid Halvar Halvard (Alvilde Alva (Alfie Alvor Joralv) Alfonse)) Calvin (Tjalve Alvbert Alvard))"
对此
[
'Alvor',
'(Alv Alf Alvaro Calvin )',
'(Halfrid Halvar Halvard )(Tjalve Alvbert Alvard)',
'(Alvilde Alva Alfonse)',
'(Alfie Alvor Joralv)'
]
let alver = "Alvor (Alv Alf Alvaro (Halfrid Halvar Halvard (Alvilde Alva (Alfie Alvor Joralv) Alfonse)) Calvin (Tjalve Alvbert Alvard))";
let open = 0;
const tree = [];
tree[0] = alver.match(/([a-zA-Z])+/)[0];
const processText = (string) => {
let change = false;
for(let i = 0; i < string.length; i++) {
if(string[i] === "(") {
open++;
} else if(string[i] === ")") {
change = true;
// find inner most () and assign in to its position in the tree array
tree[open] = tree[open] ?
tree[open] + string.match(/\([a-zA-Z ]+\)/)[0] :
string.match(/\([a-zA-Z ]+\)/)[0];
open--;
break;
}
}
if(change) {
open = 0;
// run again with current inner most () removed
processText(string.replace(/\([a-zA-Z ]+\)/, ""));
}
}
processText(alver);
console.log(tree)
我将选择以线性方式解析它-一次扫描即可整理文件中的所有字符。无需正则表达式。它不仅使它运行得更快(并能够解析大型文本文件),而且看起来也更好。
这是一个例子:
const data = 'Alvor (Alv Alf Alvaro (Halfrid Halvar Halvard (Alvilde Alva (Alfie Alvor Joralv) Alfonse)) Calvin (Tjalve Alvbert Alvard))'
function processText(text) {
const levels = []
let depth = 0
for (const c of text) {
if (c === '(') depth++
if (depth >= levels.length) levels.push([])
levels[depth].push(c)
if (c === ')') depth--
}
return levels.map(level => level.join(''))
}
console.log(processText(data))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句