开发者

String to Array and Hash with Regexp

I would like to turn a string with opening hours like this:

"Monday-Friday>10:00-18:00;Saturday>12:00-17:00;Sunday>12:00-15:00"

Into this:

[ {:per开发者_Python百科iod => "Monday-Friday", :hours => "10:00-18:00"}, {:period => "Saturday", :hours => "12:00-17:00"}, {:period => "Sunday", :hours => "12:00-15:00"} ]

I'm trying it with the String.scan() method but can't figure out the Regexp.

Also if you have any suggestions of how to do it in reverse the best way (i.e. when getting the opening hours from a form.)

Update - Thank you all found perfect solutions! Right now I'm using (thanks kejadlen):

str.scan(/([\w-]+)>([\d:-]+)-([\d:]+)/).map { |(p,o,c)| {:period => p, :opens => o, :closes => c} }

But now how about reversing it =) So given:

[ {:opens=>"10:00", :closes=>"18:00", :period=>"Monday-Friday"}, 
  {:opens=>"12:00", :closes=>"17:00", :period=>"Saturday"}, 
  {:opens=>"12:00", :closes=>"15:00", :period=>"Sunday"} ]

I want to merge it to:

"Monday-Friday>10:00-18:00;Saturday>12:00-17:00;Sunday>12:00-15:00"


If you prefer one-liners:

s = "Monday-Friday>10:00-18:00;Saturday>12:00-17:00;Sunday>12:00-15:00"
s.split(/;/).map{|i| Hash[[[:period, :hours], i.split(/>/)].transpose]}
# or
s.split(/;/).map{|i| p, h = i.split(/>/); {:period => p, :hours => h}}
#=> [{:period=>"Monday-Friday", :hours=>"10:00-18:00"}, {:period=>"Saturday", :hours=>"12:00-17:00"}, {:period=>"Sunday", :hours=>"12:00-15:00"}]

Edit:

Regarding the reverse, this should do the job:

a.map{|i| "#{i[:period]}>#{i[:opens]}-#{i[:closes]}"}.join(';')
=> "Monday-Friday>10:00-18:00;Saturday>12:00-17:00;Sunday>12:00-15:00"


this is how I would do it

str="Monday-Friday>10:00-18:00;Saturday>12:00-17:00;Sunday>12:00-15:00"
periods = str.split(';') 
#=> ["Monday-Friday>10:00-18:00", "Saturday>12:00-17:00", "Sunday>12:00-15:00"]
period_array=[]
periods.each do |period| 
  period_with_hours = period.split('>')
  period_array << {:period =>  period_with_hours.first, :hours => period_with_hours.last}
end

period_array

#=> [{:period=>"Monday-Friday", :hours=>"10:00-18:00"}, {:period=>"Saturday", :hours=>"12:00-17:00"}, {:period=>"Sunday", :hours=>"12:00-15:00"}]


Try this:

String S =  ([^\>]*)\>([^\;]*)\;
String T = " {:period => $1, :hours => $2}, "
originalString.replaceAll(S,T);

Might have to play with the regexp a little more but that should about do it.

Edit - Well, you asked for the answer in the context of ruby and I gave you the Java answer but the regular expression should work anyway...


This looks like it works

the_input.split(';').collect{|pair|
    period, hours = pair.split('>')
    {:period => period, :hours => hours}
}
=> [{:hours=>"10:00-18:00", :period=>"Monday-Friday"}, {:hours=>"12:00-17:00", :
period=>"Saturday"}, {:hours=>"12:00-15:00", :period=>"Sunday"}]


str.scan(/([\w-]+)>([\d:-]+)/).map {|(p,h)| {:period => p, :hours => h }}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜