解析带有嵌套括号的字符串

Raj*_*han 3 javascript parsing

我正在尝试解析括号内有括号的字符串。只要要解析的字符串非常小并且不需要很多嵌套括号,一切都可以正常工作。

但是,当要解析的字符串变大时,我不断收到诸如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))"
Run Code Online (Sandbox Code Playgroud)

对此

[
  'Alvor',
  '(Alv Alf Alvaro  Calvin )',
  '(Halfrid Halvar Halvard )(Tjalve Alvbert Alvard)',
  '(Alvilde Alva  Alfonse)',
  '(Alfie Alvor Joralv)'
]
Run Code Online (Sandbox Code Playgroud)
"Alvor (Alv Alf Alvaro (Halfrid Halvar Halvard (Alvilde Alva (Alfie Alvor Joralv) Alfonse)) Calvin (Tjalve Alvbert Alvard))"
Run Code Online (Sandbox Code Playgroud)

Sco*_*son 5

我会选择以线性方式解析它 - 在一次扫描中组织文件中的所有字符。不需要正则表达式。它不仅使它运行得更快(并且能够解析大型文本文件),而且看起来也更好一些。

这是一个例子:

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))
Run Code Online (Sandbox Code Playgroud)