加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 拆分具有键值对的文本行,其中value可以为空

发布时间:2020-12-15 19:26:38 所属栏目:百科 来源:网络整理
导读:我需要拆分一行文字 传递指令的一般语法是||| name | value || name | value || … .. ||| 每个交货指令以3个管道字符开始和结束 – ||| 交货指令是由一个管道分隔的一组名称/值对,例如名称|值 每个名称值对由2个管道字符||分隔 名称和值可能不包含管道符 任
我需要拆分一行文字

>传递指令的一般语法是||| 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<Match>().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 |

解决方法

我认为你让它变得比它需要的更难.这个正则表达式产生了预期的结果:

@"[^|]+|([^|]*)"

假设您正在处理单一的,格式正确的交付指令,则无需匹配起始和结束三重管道.您也不必担心双管分隔符,因为“name | value”对的“name”部分始终存在.只需查看第一个看起来像一个带有管道的名称的东西,直到下一个管道字符的所有内容都是值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读