2014-02-08 98 views
0

我工作的一種方式,一個字符串,這樣寫鍵值數據:ALGO - 鍵值表達式解析(C)

{k1=v1__k2=v2__k3=v3} 

不是什麼大不了的解析,但問題變大時,我想補充的可能性,寫一組鍵值爲關鍵的值,如:

{k1=v1__k2={k21=v21__k22=v22}__k3=v3} 

而且,這將是最好啓用的可能性,以增加更多的深處,我結構,例如:

{k1=v1__k2=v2__k3={k31={k311=v311__k312=v312__k313={k3131=v3131}}__k32=v32} 

我試着用C語言來解析它,但用簡單的方法解析它就變得很難了(split __和{}個字符),我也嘗試過用正則表達式來分割每個鍵和值,但是我失去了層次結構(深度)數據...問題的

限制條件:

  • 數據結構可以接受一個以上的深度
  • 特殊字符(或字符集)可以被改變(不同於__或{})

任何人都知道一個好的算法? 我不確定,但JSon格式有相同的約束,我錯了嗎? 許多謝謝@ll

+2

最簡單的就是使用遞歸。甚至不要考慮正則表達式。 – 2014-02-08 17:30:08

+0

好的,但你如何解析'價值'來取得整個價值,而不僅僅是一個子價值?例如:{k = v__k = {k = v__k = v__k = {k = v}} __ k = {k = v} __ k = v} 您需要計算集合的開始和結束嗎?我會嘗試 – PacDroid

+1

你通常通過創建一個合適的數據結構來解析這種東西。例如,鍵值對的動態數組(類似於'struct dict {char ** keys; union {char * str; struct dict * dict;} * values;}'然後您可以創建解析器這個數據結構的樹(稱爲AST,用於「抽象語法樹」) – 2014-02-08 17:50:32

回答

0

而不是試圖寫你自己的數據表示,我建議你使用XML或JSON。兩者都超過了工作。如果您使用XML,libxml是您的朋友。有許多JSON庫,包括(例如)libyajl。 XML和JSON都經過嘗試和測試,可以應付轉義和堡壘。 XML還允許查詢xpath和(如果您需要)DTD功能。相信我,這比重新發明輪子要好。

+0

我認爲你是對的,我將使用一些json庫。我選擇去jsmn,我會嘗試它。 – PacDroid