关键值对的正则表达式

时间:2013-12-30 15:08:53

标签: c# regex

我对正则表达式不太满意,我需要从字符串中解析出键/值对。字符串的一个例子是:

Event Name CallingNumber:+15555555555 CallID:12345 CallingName:Doe, John CallingTime:12-26-2013 14:27:41.645497

我正在寻找的结果是这样的:

CallingNumber=+15555555555
CallID=12345
CallingName=Doe, John
CallingTime=12-26-2013 14:27:41.645497

键/值对由空格分隔,但允许该值包含空格(例如:Doe,John)。如果值被引号或其他东西包围,那将是很好的,但它们不是。基本上我正在尝试匹配一个没有空格后跟冒号的单词,然后匹配冒号之后的任何字符,直到它到达另一个没有空格后跟冒号的单词。

3 个答案:

答案 0 :(得分:2)

您的匹配是不可能的,这些字段是以:分隔的,但您的日期为:,而且正则表达式无法真正区分这些字段。

不过,这就是我想出来的:

(.+?):(.+?)(?=(?:[^\s]+:)|(?:$))

再次,由于约会,这不会完美。

这是一个演示的小提琴:http://www.rexfiddle.net/Wm3NiK0


编辑:如果您的“密钥”只是字母(而不是数字),这可以避免时间/日期问题,那么这将有效:

([A-Za-z]+?):(.+?)\s?(?=(?:[A-Za-z]+:)|(?:$))

这是另一个证明这一点的小提琴:http://www.rexfiddle.net/sGQs7YV

答案 1 :(得分:1)

您可以重复应用正则表达式,使用(。*)返回“尚待解析”的余数

以伪代码形式,这可能是:

  match string to "^(([^:]*\s)*[^:]*)\s+(.*)$"
  should grab "Event Name" and leave the rest as $3

 loop:
  keep only $3 as new base string
  match new base string to "^(\w+)[:](.+?)\s+(\w+[:].*)$"
  key = $1, value = $2, new remainder = $3
  repeat until no $1, $2 values are returned

答案 2 :(得分:0)

“我在起诉.NET(c#),”好主意! :)微软需要放在它的位置!

您是否拥有固定数量的字段,或者它们的数量是否有所不同?你每次都期望相同的领域吗?以相同的顺序?如果是一个固定的数字,你可以硬编码正则表达式中的字段数,但我仍然认为只用一个正则表达式来尝试这样做是令人头疼的问题。使用一些脚本代码并逐个分解,首先拆分它:\ s +。然后将组中的最后一个单词作为下一组的名称剥离,其余的是前一组的值。第一组和最后一组必须有一些特殊待遇。我认为这比在一个丑陋的正则表达式中尝试这样做更容易,也更容易理解很多。作为奖励,可以处理任何顺序的任何数量的字段。