复杂的正则表达式:键值对

时间:2016-11-22 13:04:41

标签: c# regex

我无法弄清楚这类数据的正确正则表达式:

  

电话 - 工作:1111111111电话 - 传真工作:222222222电话:   (333)333-3333电子邮件::email@email.com

期望的结果是:

Col1    Col2       Col3
Phone   Work       1111111111 
Phone   Fax Work   222222222 
Phone   General    (333) 333-3333
Email   null       email@email.com

密钥由两部分组成(第二部分可能缺失): Phone-Work:Email-:

可以有4种类型的密钥:Phone-Email-User ID-Web address-

我无法弄清楚如何创建一个将采用value部分并在新key之前停止的正则表达式。

以下是我正在尝试的一些数据:

https://regex101.com/r/weEc3A/1

2 个答案:

答案 0 :(得分:4)

您可以使用

之类的解决方案
(?si)(Phone|Email|User ID|Web address)-([^:]*):\s*((?:(?!(?:Phone|Email|User ID|Web address)-).)*)

相当于

(?si)(Phone|Email|User ID|Web address)-([^:]*):\s*(.*?)(?=(?:Phone|Email|User ID|Web address)-|$)

请参阅regex demo

<强>详情:

  • (Phone|Email|User ID|Web address)- - 匹配可能的起始值,然后-将其捕获到第1组
  • ([^:]*) - 将:以外的零个或多个字符捕获到第2组
  • :\s* - 冒号后跟零个或多个空格
  • ((?:(?!(?:Phone|Email|User ID|Web address)-).)*) - 第3组捕获未启动与.模式匹配的序列的任何字符((?:Phone|Email|User ID|Web address)-)。

由于使用(?s)修饰符,.也会匹配换行符。在C#中,您可以使用RegexOptions.Singleline标志而不是此内联选项。 (?i)RegexOptions.IgnoreCase标志的内联等效项。组合时,内联修饰符可以写在一对括号内:(?si)

答案 1 :(得分:1)

也许这个是你的开始:

(.*?)-(.*?):\s*([- ()+\w@.]+)(?![-\w]*:)