2013-04-12 13 views
-2

我有一個包含嵌套括號的字符串:解析字符串,提取命令和相關聯的參數與嵌套括號

string commandLine = "position(1, random(1, random(1, 9)), random(3, 15))" 

我想解釋此字符串的規則如下

的CommandName(參數1,參數,參數3)

其中:

  • 「(」和「)」括號內的逗號分隔每個參數

這使我相信,我會首先需要設計一種方法來確定分離與命令名

  • 相關的參數「」與每個命令關聯的正確的開啓和關閉括號。

    this這個問題的頂部答案看來,我不能使用正則表達式。那麼我應該如何處理這個任務?

    編輯:

    有一個想法。

    「(」打黑第一左括號後的括號內。 這個數字表示的後續集合中的右括號支架的指數「)」計數的數量

    我的措辭失敗我,但我相信這是一個開始?

    position(1, random(1, random(1, 9)), random(3, 15)) 
    
    Opening 1   2   3    4 
    Closing       12    34 
    
  • +0

    還有一些悲慘的用戶沒有任何建設性的批評就投了票。謝謝。 – user1423893

    +0

    爲了你自己的利益,不要給任何人打電話,這隻會疏遠願意幫助你的人,更好地問爲什麼這個問題會被低估。 – Rafael

    +0

    我明白你的觀點,但這個形容詞只適用於投票反對的人。這不是針對任何願意給出答案的人。最好先發表評論,然後進行投票,而不是讓提問者感到困惑? – user1423893

    回答

    0

    你可以通過很多方式去解決這個問題。這裏是一個:

    使用正則表達式匹配所有出現的[a-z]+\s*\([^()]+\)。這隻會匹配其參數不包含任何其他命令的命令。在你的例子中,這些將是random(1, 9)random(3, 15)

    對於每個匹配項,計算結果(或產生內存中的表示形式,無論您的事情是什麼)。這應該不難,因爲你可以很容易地隔離命令名和分隔逗號來分隔參數(這裏沒有錯誤解析的機會,因爲我們知道沒有參數是一個命令)。

    將結果存儲在字典中,使用不含糊的內容作爲關鍵字。例如,假定它通常是不合法的參數與?開始,第一步後,你可能最終與本字典:

    "?1" => [the result or representation of random(1, 9)] 
    "?2" => [the result or representation of random(3, 15)] 
    

    與佔位符?1?2替換原來的匹配。你現在已經消除了最內層的嵌套命令。重複該過程,根據需要參考字典;每次迭代都會消除最內層命令集。

    當輸入字符串(作爲多次轉換的主題)被縮減爲?XXX時,您已經成功解析了所有內容,最終結果是添加到字典中的最後一個條目(您可以使用輸入字符串作爲鍵)。如果正則表達式不匹配任何內容,並且輸入字符串不是這種形式,那麼原始輸入有語法錯誤。

    這不是迄今爲止最高效的算法,但它很容易在高層實現,並且不需要您編寫繁瑣的char-by-char解析代碼。