Строка в массив и хэш с регулярным выражением - PullRequest
0 голосов
/ 02 февраля 2010

Я бы хотел повернуть строку с часами работы, как это:

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

В это:

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

Я пытаюсь сделать это с помощью метода String.scan (), но не могу определить регулярное выражение.

Также, если у вас есть какие-либо предложения о том, как сделать это в обратном порядке наилучшим образом (т.е. при получении часов работы из формы).

Обновление - Спасибо всем, нашли идеальные решения! Прямо сейчас я использую (спасибо kejadlen):

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

Но теперь, как насчет того, чтобы поменять его =) Итак, дано:

[ {: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"} ]

Я хочу объединить это с:

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

Ответы [ 5 ]

3 голосов
/ 02 февраля 2010

Если вы предпочитаете однострочники:

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:

Что касается обратного, это должно сделать работу:

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"
2 голосов
/ 02 февраля 2010

вот как бы я это сделал

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"}]
0 голосов
/ 02 февраля 2010
str.scan(/([\w-]+)>([\d:-]+)/).map {|(p,h)| {:period => p, :hours => h }}
0 голосов
/ 02 февраля 2010

Похоже, это работает

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"}]
0 голосов
/ 02 февраля 2010

Попробуйте это:

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

Возможно, придется поиграть с регулярным выражением немного больше, но это должно сделать.

Редактировать - Ну, вы спросили ответ в контексте ruby, и я дал вам ответ Java, но регулярное выражение должно работать в любом случае ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...