如何使用正则表达式将字符串解析为键值对?

时间:2018-06-13 14:43:14

标签: json regex parsing fluentd

使用正则表达式将字符串解析为键值对的最佳方法是什么?

示例输入:

application="fre" category="MessagingEvent" messagingEventType="MessageReceived"

预期输出:

application         "fre"
Category            "MessagingEvent"
messagingEventType  "MessageReceived"

我们已经尝试了以下正则表达式及其工作原理。

application=(?<application>(...)*) *category=(?<Category>\S*) *messagingEventType=(?<messagingEventType>\S*)

但我们想要一个通用的正则表达式,它会将样本输入解析为预期的输出作为键值对吗?

任何想法或解决方案都会有所帮助。

2 个答案:

答案 0 :(得分:1)

input = 'application="fre" category="MessagingEvent" messagingEventType="MessageReceived"'

puts input.
       scan(/(\w+)="([^"]+)"/). # scan for KV-pairs
       map{ |k, v| %Q|#{k.ljust(30,' ')}"#{v}"| }. # adjust as you requested 
       join($/) # join with platform-dependent line delimiters

#⇒ application                   "fre"
#  category                      "MessagingEvent"
#  messagingEventType            "MessageReceived"

答案 1 :(得分:0)

不是使用正则表达式,而是可以通过将字符串拆分并存储在哈希中来完成,如下所示:

input = 'application="fre" category="MessagingEvent" messagingEventType="MessageReceived"'
res = {}
input.split.each { |str| a,b = str.split('='); res[a] = b}
puts res
==> {"application"=>"\"fre\"", "category"=>"\"MessagingEvent\"", "messagingEventType"=>"\"MessageReceived\""}