当前位置:  开发笔记 > 编程语言 > 正文

拆分一行具有键值对的文本,其中值可以为空

如何解决《拆分一行具有键值对的文本,其中值可以为空》经验,为你挑选了1个好方法。

我需要拆分一行文字

    传递指令的一般语法是||| name | value || name | value || ... .. |||

    每个交货指令以3个管道字符开始和结束 - |||

    传递指令是由单个管道分隔的一组名称/值对,例如名称|值

    每个名称值对由2个管道字符||分隔

    名称和值可能不包含管道符

    任何一对的值可以是空字符串.

我需要一个正则表达式来帮助我解决上述问题.

我有限的正则表达式技能的最新尝试:

string SampleData = "|||env|af245g||mail_idx|39||gen_date|2016/01/03 11:40:06||docm_name|Client Statement (01.03.2015?31.03.2015)||docm_cat_name|Client Statement||docm_type_id|9100||docm_type_name|Client Statement||addr_type_id|1||addr_type_name|Postal address||addr_street_nr|||addr_street_name|Robinson Road||addr_po_box|||addr_po_box_type|||addr_postcode|903334||addr_city|Singapore||addr_state|||addr_country_id|29955||addr_country_name|Singapore||obj_nr|10000023||bp_custr_type|Customer||access_portal|Y||access_library|Y||avsr_team_id|13056||pri_avsr_id|||pri_avsr_name|||ctact_phone|||dlv_type_id|5001||dlv_type_name|Channel to standard mail||ao_id|14387||ao_name|Corp Limited||ao_title|||ao_mob_nr|||ao_email_addr||||??";
string[] Split = Regex.Matches(SampleData, "(\|\|\|(?:\w+\|\w*\|\|)*\|)").Cast().Select(m => m.Value).ToArray();

预期输出应如下(基于提供的样本数据字符串):

    ENV | af245g

    mail_idx | 39

    gen_date | 2016/01/03 11:40:06

    docm_name |客户声明(01.03.2015-31.03.2015)

    docm_cat_name |客户声明

    docm_type_id | 9100

    docm_type_name |客户声明

    addr_type_id | 1

    addr_type_name |邮政地址

    addr_street_nr |

    addr_street_name |罗宾逊道

    addr_po_box |

    addr_po_box_type |

    addr_postcode | 903334

    addr_city |新加坡

    addr_state |

    addr_country_id | 29955

    addr_country_name |新加坡

    obj_nr | 10000023

    bp_custr_type |客服

    access_portal | Y

    access_library | Y

    avsr_team_id | 13056

    pri_avsr_id |

    pri_avsr_name |

    ctact_phone |

    dlv_type_id | 5001

    dlv_type_name |标准邮件的频道

    ao_id | 14387

    ao_name | Corp Limited

    ao_title |

    ao_mob_nr |

    ao_email_addr |

Syed Muhamma.. 6

您也可以在不使用Regex的情况下执行此操作.它只是简单的分裂.

    string nameValues = "|||zeeshan|1||ali|2||ahsan|3|||";
    string sub = nameValues.Substring(3, nameValues.Length - 6);
    Dictionary dic = new Dictionary();
    string[] subsub = sub.Split(new string[] {"||"}, StringSplitOptions.None);

    foreach (string item in subsub)
    {
        string[] nameVal = item.Split('|');
        dic.Add(nameVal[0], nameVal[1]);
    }

    foreach (var item in dic)
    {
        // Retrieve key and value here i.e:
        // item.Key
        // item.Value
    }

希望这可以帮助.



1> Syed Muhamma..:

您也可以在不使用Regex的情况下执行此操作.它只是简单的分裂.

    string nameValues = "|||zeeshan|1||ali|2||ahsan|3|||";
    string sub = nameValues.Substring(3, nameValues.Length - 6);
    Dictionary dic = new Dictionary();
    string[] subsub = sub.Split(new string[] {"||"}, StringSplitOptions.None);

    foreach (string item in subsub)
    {
        string[] nameVal = item.Split('|');
        dic.Add(nameVal[0], nameVal[1]);
    }

    foreach (var item in dic)
    {
        // Retrieve key and value here i.e:
        // item.Key
        // item.Value
    }

希望这可以帮助.

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有