2016-11-08 58 views
0

我试图编写一个函数,将括号中包含的单词提取到自己的数组中,递归地解释嵌套圆括号。递归提取字符串中嵌套括号的内容

所以对于“((AB)啊(一二))PI”,我想,要翻译成以下结构:

[ 
    [ 
    [ 
     "a", 
     "b" 
    ], 
    "ugh", 
    [ 
     "1", 
     "2" 
    ], 
    ] 
    "pi" 
] 

为此,我写了下面的函数:

function shitshow(hell) { 
    var ssparts = []; 
    var done = false; 
    for (i in hell) { 
     let part = hell[i]; 
     switch(part) { 
      case "(": 
       ssparts.push(shitshow(hell.slice(i+1))); 
       break; 
      case ")": 
       done = true; 
       break; 
      default: 
       ssparts.push(part); 
     } 
     if (done) break; 
    } 
    return ssparts; 
} 

console.log(shitshow("((developer or engineer) or (nurse or doctor)) and manager")); 

它不起作用。它返回我的阵列(我在节点4测试这个):

[ 
    "", 
    [ 
    "doctor" 
    ], 
    [], 
    "developer", 
    "or", 
    "engineer" 
] 

被这个搏斗了一会儿。有任何想法吗?


编辑:由于@Oriol在这篇文章的评论下文提到的,我贴的代码不产生我贴的输出。这是因为我忘记提及/包括将RegEx的初始字符串转换为单词和非字母数字符号的数组。为此事道歉。由于@Oriol已经发布了一个工作解决方案,因此我将此通知包含在内,而不是更新我的代码,以便他的发布解决方案能够成功。

+0

爱那些函数名 – Derek

+2

没有办法,你的代码产生的输出。您正在向数组推送单个字符。 – Oriol

+0

@Oriol好的一点,我忘了补充说我使用RegEx将字符串拆分为一个单词数组并且没有字母符号。只要我再次在我的笔记本电脑上就会更新。 – dylan

回答

2

我通常做类似下面的事情。

外部函数接收字符串作为参数并声明用于迭代它的外部变量。

该工作在递归内部函数中完成,该函数迭代到)

这样我创建的所有新字符串都包含在返回的数组中。没有无用的工作完成。

function shitshow(str) { 
 
    var i = 0; 
 
    function main() { 
 
    var arr = []; 
 
    var startIndex = i; 
 
    function addWord() { 
 
     if (i-1 > startIndex) { 
 
     arr.push(str.slice(startIndex, i-1)); 
 
     } 
 
    } 
 
    while (i < str.length) { 
 
     switch(str[i++]) { 
 
     case " ": 
 
      addWord(); 
 
      startIndex = i; 
 
      continue; 
 
     case "(": 
 
      arr.push(main()); 
 
      startIndex = i; 
 
      continue; 
 
     case ")": 
 
      addWord(); 
 
      return arr; 
 
     } 
 
    } 
 
    addWord(); 
 
    return arr; 
 
    } 
 
    return main(); 
 
} 
 
console.log(shitshow("((developer or engineer) or (nurse or doctor)) and manager"));
div.as-console-wrapper { max-height: 100%; }

+0

这是一个错误,这会在上面的例子中留下最后一个字母。点击“Run code snippet”并返回:'“和”,“管理”'没有R. – Ciantic

1

一种方法可能是将其重新格式化为JSON,然后让JSON.parse()完成所有工作。喜欢的东西:

function blah(string) { 
 
\t string = string.replace(/\(/g, "["); 
 
\t string = string.replace(/\)\s/g, "], "); 
 
\t string = string.replace(/\)/g, "]"); 
 
\t string = string.replace(/\s+/, ", "); 
 
\t string = "[" + string + "]"; 
 
\t string = string.replace(/[^\[\]\,\s]+/g, "\"$&\""); 
 
\t string = string.replace(/" /g, "\", "); 
 

 
\t return JSON.parse(string); 
 
} 
 

 
console.log(blah("((a b) ugh (one two)) pi"));

编辑:修正了一些问题,如发布运行代码的正则表达式&。与测试字符串一起使用。

[[["a","b"],"ugh",["one","two"]],"pi"] 

目前的情况是,如果你的字符串没有与字之间“)”的空间也不会应付,也不如果两者之间“))”的空间,但如果你的输入格式为如上所述已知和僵化,那么它会很好。否则,进一步的正则表达式调整或替换可以解决这个问题。

+0

修复了代码。现在用我的测试字符串工作。 –

+0

根据文本来源的来源,如果可以从源代码获取JSON,这将使它成为一个简单的单行解决方案。我只提到这一点,因为你的字符串已经和JSON类似了,但是它们可能来自你没有太多控制格式的来源。 –

相关问题