2017-01-20 109 views
1

我有一組JSONish字符串,但完全不符合JSON。這也是一種CSV,但價值本身有時候會有逗號。解析JSON類型的字符串

的字符串是這樣的:

ATTRIBUTE:這個屬性,ATTRIBUTE2的價值:另一個價值,但是這一次中有一個逗號,ATTRIBUTE3:,另一個值...

只有兩個模式,我可以看到,大多數工作是屬性名稱在大寫字母后面跟着:和空格。在第一個屬性之後,模式是名稱空間。

的數據存儲在紅移,所以我要看看我是否可以使用正則表達式來解決這一點,但我的正則表達式的知識是有限的 - 我會在哪裏開始呢?

如果不是,我會採取蟒蛇黑客。

+0

首先,問自己: 「我想從我的輸入檢索什麼」 _ _。之後,你可以搜索如何做到這一點。一個好的觀點,你注意到你的輸入中的一個「模式」,你可以寫一個正則表達式。 – Niitaku

+0

我基本上想要檢索一個乾淨的可訪問的鍵/值存儲,我可以分析或轉換爲列數據集。 答案可能只是:我需要學習正則表達式。 – econgineer

+0

我不介意幫忙。 ;)你想使用哪種語言的正則表達式?您可以編輯您的問題以添加您在評論中撰寫的所有信息。 – Niitaku

回答

0

你描述會是這樣的內容:

^([A-Z\d]+?): (.*?), ([A-Z\d]+?): (.*?), ([A-Z\d]+?): (.*)$ 

雖然這個答案就意味着你的第三個屬性值並沒有真正用逗號開始,你的屬性名稱可以countain號碼。

如果我們把這個APPART:多達需要,上升到第:

  • (.*?),一個空間,根據需要

    • [A-Z\d]大寫字母和數字
    • +?:然後儘可能多的字符高達昏迷空間
    • ^$開始時和一個字符串的末尾,分別

    而其餘的是該圖案的重複。

    ()都只是爲了識別您捕捉部分,在這種情況下,他們不會直接影響了比賽。

    Here's a working example

  • +0

    您的答案不會起作用,它會在第一個大寫字母后面跟着一個冒號和一個空格選擇所有的字符串(即'這個屬性的值,ATTRIBUTE2:另一個值,但是這個值中有一個逗號ATTRIBUTE3:,另一個值' – Niitaku

    +0

    你是對的,雖然給出的例子似乎並不代表需求,因爲在這個例子中也有數字,第三個數值以逗號開頭......這樣會更好地匹配數字,三個屬性,但不是逗號[AZ \ d] +?:\ s(。*?),[AZ \ d] +?:\ s(。*?),[AZ \ d] +?:\ s(。*?)' – TaoStyle

    +0

    讓我們等待OP澄清其需求。:) – Niitaku

    0

    常正則表達式是不是在現在看來似乎是使用合適的工具。

    閱讀周到職位的詳細信息:https://softwareengineering.stackexchange.com/questions/223634/what-is-meant-by-now-you-have-two-problems

    當一個簡單的方案會做,用它!下面是一個方案,該方案將成功,只要冒號唯一屬性和值之間發生解析結構,也不在他們

    代碼

    static void Main(string[] args) 
    { 
        string data = "ATTRIBUTE: Value of this attribute,ATTRIBUTE2: Another value, but this one has a comma in it,ATTRIBUTE3:, another value,value1,ATTRIBUTE4:end of file"; 
    
    
        Console.WriteLine(); 
        Console.WriteLine("As an String"); 
        Console.WriteLine(); 
    
        Console.WriteLine(data); 
    
        string[] arr = data.Split(new[] { ":" }, StringSplitOptions.None); 
    
        Dictionary<string, string> attributeNameToValue = new Dictionary<string, string>(); 
    
        Console.WriteLine(); 
        Console.WriteLine("As an Array Split on ':'"); 
        Console.WriteLine(); 
    
        Console.WriteLine("{\"" + String.Join("\",\"", arr) + "\"}"); 
    
        string currentAttribute = null; 
        string currentValue = null; 
    
        for (int i = 0; i < arr.Length; i++) 
        { 
         if (i == 0) 
         { 
          // The first element only has the first attribute name 
          currentAttribute = arr[i].Trim(); 
         } 
         else if (i == arr.Length - 1) 
         { 
          // The last element only has the final value 
          attributeNameToValue[currentAttribute] = arr[i].Trim(); 
         } 
         else 
         { 
          int indexOfLastComma = arr[i].LastIndexOf(","); 
          currentValue = arr[i].Substring(0, indexOfLastComma).Trim(); 
          string nextAttribute = arr[i].Substring(indexOfLastComma + 1).Trim(); 
    
          attributeNameToValue[currentAttribute] = currentValue; 
    
          currentAttribute = nextAttribute; 
         } 
        } 
    
        Console.WriteLine(); 
        Console.WriteLine("As a Dictionary"); 
        Console.WriteLine(); 
    
        foreach (string key in attributeNameToValue.Keys) 
        { 
         Console.WriteLine(key + " : " + attributeNameToValue[key]); 
        } 
    } 
    

    輸出:

    作爲字符串

    ATTRIBUTE:此屬性的值,ATTRIBUTE2:另一個值,但這個有一個逗號在它,ATTRIBUTE3 :,另一個值,值1,ATTRIBUTE4:文件

    的端作爲在陣列分割 ':'

    { 「ATTRIBUTE」, 「這個屬性,ATTRIBUTE2" 的值,」 另一值,但是這一次在其中具有逗號,ATTRIBUTE3" , 「另一個值,值1,ATTRIBUTE4」, 「文件結束」}

    作爲字典

    ATTRIBUTE:此屬性的值

    ATTRIBUTE2:另一個值,但是這個值有一個逗號

    ATTRIBUTE3:,另一個值,值1

    ATTRIBUTE4:文件結束