在Ruby中解析字符串(使用正则表达式?)

3
我有一个字符串。
Purchases 10384839,Purchases 10293900,Purchases 20101024

有人能帮我解析这个吗?我尝试使用StringScanner,但我对正则表达式不太熟悉(没有太多实践)。

如果我能将其分开

myarray[0] = {type => "Purchases", id="10384839"}
myarray[1] = {type => "Purchases", id="10293900"}
myarray[2] = {type => "Purchases", id="20101024"}

那将会很棒!
5个回答

23
string = "Purchases 10384839,Purchases 10293900,Purchases 20101024"
string.scan(/(\w+)\s+(\d+)/).collect { |type, id| { :type => type, :id => id }}

3
Rutger的解决方案没有问题,但这个感觉更像Ruby风格。+1 - James A. Rosen
这个答案救了我 <3 - kikito

11

你可以用正则表达式来实现它,或者只需在Ruby中实现:

myarray = str.split(",").map { |el| 
    type, id = el.split(" ")
    {:type => type, :id => id } 
}
现在你可以像这样访问它:'myarray[0][:type]'。

7

不需要正则表达式,而且可能不是最清晰的方法。在这种情况下你需要用到split方法。像这样的代码可以实现:

raw_string = "Purchases 10384839,Purchases 10293900,Purchases 20101024"
myarray = raw_string.split(',').collect do |item|
  type, id = item.split(' ', 2)
  { :type => type, :id => id }
end

这里可以找到有关split和collect方法的文档:

Enumerable.collect
String.split


2

这里是一个irb会话:

dru$ irb
irb(main):001:0> x = "Purchases 10384839,Purchases 10293900,Purchases 20101024"
=> "Purchases 10384839,Purchases 10293900,Purchases 20101024"
irb(main):002:0> items = x.split ','
=> ["Purchases 10384839", "Purchases 10293900", "Purchases 20101024"]
irb(main):006:0> items.map { |item| parts = item.split ' '; { :type => parts[0], :id => parts[1] } }
=> [{:type=>"Purchases", :id=>"10384839"}, {:type=>"Purchases", :id=>"10293900"}, {:type=>"Purchases", :id=>"20101024"}]
irb(main):007:0> 

基本上,我只需先在“,”上进行分割。然后,我会通过空格分割每个项,并使用这些部分创建哈希对象。不需要使用正则表达式。

不需要正则表达式,但也许推荐使用正则表达式?我想知道哪一个更有效率。 - SasQ

1
   s = 'Purchases 10384839,Purchases 10293900,Purchases 20101024'
   myarray = s.split(',').map{|item| 
       item = item.split(' ')
       {:type => item[0], :id => item[1]} 
   }

只是一个快速的问题:mapcollect有什么区别? - SasQ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接