2015-11-20 7 views
0

Рассмотрим у меня есть строка, как это:Извлечение чисел из строки

"1 hour 7 mins" 

Мне нужно извлечь число hour (1) и min (7). проблема либо час или минуты может быть nill так что в этом случае строка будет 1 hour ВЗ только 7 mins Я в основном заинтересованы в регулярном выражении. Я уже seen this и запустить этот код

result = duration.gsub(/[^\d]/, '') 

    result[0]!= nil ? hour=result[0] : hour=0 

    result[1]!=nil ? mins=result[1] : mins=0 

проблема, когда я только 5 mins это дает мне 5 и я не знаю, что это mins или hour Так как я могу это сделать?

+0

Вы не можете сделать это таким образом –

+0

Может у дать мне решение? – Salman

ответ

2

Что вы думаете о чем-то как это:

hours = duration.match(/[\d]* hour/).to_s.gsub(/[^\d]/, '') 
minutes = duration.match(/[\d]* mins/).to_s.gsub(/[^\d]/, '') 
+0

Ваш путь замечательный, но я думаю, вы должны положить:/(\ d *) часы?/И/(\ d *) mins?/ – Oxynum

+0

Он правильно извлекал бы даже единственное и множественное число. – Oxynum

+1

@Oxynum У вас есть действительная точка, но нет необходимости добавлять дополнительные 's?'. Помните, что регулярные выражения совпадают в любом месте строки, поэтому '/ \ d + min /' должен работать. – Mariano

2

Вы можете сделать это:

a = duration[/(\d*)(\s*hour)?s?\s*(\d*)(\s*min)?s?/][0] 
if a.include?("hour") 
    hour = a[0] 
    min = a[2] 
else 
    min = a[0] 
end 

Улучшение, это то, что я хотел:

capture = duration.match(/^((\d*) ?hour)?s? ?((\d*) ?min)?s?/) 
hour = capture[2] 
min = capture[4] 

Вы можете попробовать регулярное выражение здесь: http://rubular.com/r/ACwfzUIHBo

+0

Почему такое сложное регулярное выражение? –

+0

Ну, я не знаю, есть ли у вас предложения по улучшению? – Oxynum

+0

Тот, который дает ОП, работает, не так ли? –

0

я не мог сопротивляться немного кода гольф:

Вы можете сделать:

hours,_,mins = (duration.match /^([\d]* h)?([^\d]*)?([\d]* m)?/)[1..3].map(&:to_i) 

Пояснение:

соответствует число, то «Н», то ничего не число, то число затем «m». Затем получает данные соответствия и делает .to_i (который в рубине, если он начинается с числа, использует это число). Затем он назначает 1-й и третий матч в часах и минутах, соответственно:

Выход:

2.2.1 :001 > duration = "5 hours 26 min" 
=> "5 hours 26 min" 
2.2.1 :002 > hours,_,mins = (duration.match /^([\d]* h)?([^\d]*)?([\d]* m)?/)[1..3].map(&:to_i) 
=> [5, 0, 26] 
2.2.1 :003 > hours 
=> 5 
2.2.1 :004 > mins 
=> 26 
2.2.1 :005 > duration = "5 hours" 
=> "5 hours" 
2.2.1 :006 > hours,_,mins = (duration.match /^([\d]* h)?([^\d]*)?([\d]* m)?/)[1..3].map(&:to_i) 
=> [5, 0, 0] 
2.2.1 :007 > duration = "54 mins" 
=> "54 mins" 
2.2.1 :008 > hours,_,mins = (duration.match /^([\d]* h)?([^\d]*)?([\d]* m)?/)[1..3].map(&:to_i) 
=> [0, 0, 54] 
2.2.1 :009 > 
Смежные вопросы