2012-11-28 54 views
1

我只是試圖找到類似的東西來解決問題,但我只發現了一些「零件」,我不知道如何將它們合併。所以我希望任何人都可以幫助我。問題:RegEx拆分數組(字符串)與嵌套數組

我有一個字符串,它包含一個(或多個)嵌套數組的數組。

[1, 'AB C',[1, 'AB C', 「ABC」], 「ABC」]

或也許

[1,[」 AB C '],' 一」,[1, 「ABC」], 「ABC」]

等等

我想在我的結果頂部陣列分裂了用逗號分隔,但有嵌套數組,包括逗號,但沒有括號。

例如,對於用於第一字符串:

[0] - > 1

[1] - > 'ABC'

[2] - > 1, 'AB C', 「ABC」

[3] - > 「ABC」

我當前正則表達式,其提供我的分裂頂部陣列爲:

/\ [[\ W \ d \ S \,\ '\ 「] +] | [\ W \ d \ S \」 \'] + /克

但現在我不知道如何更改我的正則表達式以「剪切」內部括號... 我已經嘗試了使用lookaheads/-behinds,單詞邊界,組等的不同方式,但沒有任何成功。那甚至有可能?如果是,如何?

也許我選擇了錯誤的方法,但我需要說我是新的正則表達式。 因此,如果前者不太正確,請讓我發覺。

非常感謝您的幫助!

馬爾科

+0

什麼語言,你」重新使用? – inhan

+0

什麼是你分裂的文字?它看起來像JSON。什麼創造了文字?如果它是一個衆所周知的格式,而不是你剛纔製作的,那麼可能有現成的代碼來爲你解析。 –

回答

0

嘗試

String[] parts = string.substring(1,string.length()-1).split(","); 
for (int n = 0; n < parts.length; n++) { 
    if (parts.charAt(0) == '[') parts[n] = parts[n].substring(1,parts[n].length()-1); 
} 

字面上做你所說的話

頂部陣列由逗號分裂了,但有沒有括號的嵌套數組。

有時候,編程可以是簡單的:)

0

這種分裂正則表達式是相當難看,但你想要做什麼。從我可以通過使用RegexBuddy得知,它只能在.NET中工作。

(?<=^\[(?:(?>\[[^\]\[]+(?:\]|(?=\])))|(?>[^\[\]]+))*|^)[,\[\]]+ 

,因爲我喜歡用正則表達式,在這種情況下,我認爲我會這樣(用C#編寫)的一個小功能是差不多:

string[] DeserializeArray(string serializedArray) { 
    const char OPEN_GROUP = '[', CLOSE_GROUP = ']', DELIMITER = ','; 
    List<string> deserializedArray = new List<string>(); 
    StringBuilder accumulator = new StringBuilder(); 
    int nestDepth = 0; 
    int baseDepth = serializedArray[0] == OPEN_GROUP ? 1 : 0; 
    for(int i=0; i<serializedArray.Length; ++i){ 
     if(serializedArray[i] == OPEN_GROUP) ++nestDepth; 
     else if(serializedArray[i] == CLOSE_GROUP) --nestDepth; 
     else if(serializedArray[i] == DELIMITER && nestDepth <= baseDepth) { 
      deserializedArray.Add(accumulator.ToString()); 
      accumulator.Clear(); 
     } 
     else { 
      accumulator.Append(serializedArray[i]); 
     } 
    } 
    deserializedArray.Add(accumulator.ToString()); 
    return deserializedArray.ToArray(); 
}