我对正则表达式不太满意,我需要从字符串中解析出键/值对。字符串的一个例子是:
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)。如果值被引号或其他东西包围,那将是很好的,但它们不是。基本上我正在尝试匹配一个没有空格后跟冒号的单词,然后匹配冒号之后的任何字符,直到它到达另一个没有空格后跟冒号的单词。
答案 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 +。然后将组中的最后一个单词作为下一组的名称剥离,其余的是前一组的值。第一组和最后一组必须有一些特殊待遇。我认为这比在一个丑陋的正则表达式中尝试这样做更容易,也更容易理解很多。作为奖励,可以处理任何顺序的任何数量的字段。