2016-11-08 91 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類似了,但是它們可能來自你沒有太多控制格式的來源。 –

相關問題