2017-01-20 204 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:文件结束