2015-10-10 4 views
0

У меня есть эта строка:Extract Дата из строки рубин

Rep. Barletta, Lou [R-PA-11] (Introduced 06/04/2015) 

И я хочу, чтобы извлечь дату, которая является «06/04/2015». Как это сделать в рубине? Я пытался сделать что-то вроде этого:

str[-1..-11] 

но не работало. Любое предложение? Благодаря!

+0

Это всегда то же самое имя/формат? Я бы рекомендовал использовать регулярные выражения для этого. – Piccolo

+0

@Piccolo да, это всегда один и тот же формат .. как я использую регулярное выражение для этого? Я не привык к этому. –

ответ

3
str = "Rep. Barletta, Lou [R-PA-11] (Introduced 06/04/2015)" 
str.match(/(\d{2}\/\d{2}\/\d{4})/)[0] 
#=> "06/04/2015" 

Этот код соответствует любому, который находится в формате 2-х номеров/2 числа/4 числа и возвращает его.

Если есть возможность иметь XX/XX/XXXX где-то в строке, я бы, вероятно, использовать следующий код вместо:

str = "Rep. Barletta, Lou [R-PA-11] (Introduced 06/04/2015)" 
str.match(\(Introduced (\d{2}\/\d{2}\/\d{4})\)$)[0] 
#=> "06/04/2015" 

Это отыскивает (Introduced XX/XX/XXXX) и захватывает дату от того, в частности, ,

+0

Спасибо! Вы сохранили мою жизнь :) –

+0

Предположим, что 'str # =>" Rep. Barletta, Lou [R-PA-11] 99/99/9999 (Представлено 06/04/2015) "'? –

+0

@CarySwoveland OP сказал, что он был в том же формате каждый раз – Piccolo

1

ул [-11 ..- 2], если положение даты не меняет

+0

Возможно, лучший ответ. ОП был почти там. 'str [-11,10]' также работает. (Отредактируйте для установки обратных шагов вокруг str [-11 ..- 2], чтобы он выглядел следующим образом: 'str [-11 ..- 2]'). –

2

Дата имеет метод разбора, который, как оказалось, просто работает.

require 'date' 

str = "Rep. Barletta, Lou [R-PA-11] (Introduced 06/04/2015)" 
p d = Date.parse(str) # => #<Date: 2015-04-06 ((2457119j,0s,0n),+0s,2299161j)> 
1

Я согласен с комментарием Пикколо. Вот простое регулярное выражение, которое вы можете попробовать в irb. Я рекомендую экспериментировать с irb, чтобы изучить некоторые рудиментарные Ruby regular expressions.

Например, /.+([0-9]{2}\/[0-9]{2}\/[0-9]{4}).+/ ищет что-либо следуют две цифры, слэш, две цифры, слэш, четыре цифры, то ничего:

$ irb 
2.2.0 :001 > s='Rep. Barletta, Lou [R-PA-11] (Introduced 06/04/2015)' 
2.2.0 :009 > /.+([0-9]{2}\/[0-9]{2}\/[0-9]{4}).+/ =~ s && $1 
=> "06/04/2015" 
2.2.0 :010 > 
+0

Yup this works ... Спасибо! :) –

+0

У этой же слабости, как ответ Пикольло. –

+0

@ Cary Swoveland, следовательно, необходимо экспериментировать. Я написал «тогда все» - я должен был быть более явным, «... включая другую дату (которая будет проигнорирована)». –

0

@ ответ steenslag выглядит для действительных дат (в отличие от других ответов) но все еще может быть споткнулся:

str = "The first 10 may go 15/15/2015 with Lou (Introduced 06/04/2015)" 
Date.parse(str) 
    #=> #<Date: 2015-05-10 ((2457153j,0s,0n),+0s,2299161j)> 

Для обеспечения даты в указанном формате, вы можете сделать следующее:

require 'date' 

def extract_date(str, fmt) 
    a = str.each_char 
     .each_cons(10) 
     .find { |a| Date.strptime(a.join, fmt) rescue nil } 
    a ? a.join : nil 
end 

Для str, как описано выше:

extract_date(str, '%d/%m/%Y') 
    #=> "06/04/2015" 

Второй пример:

extract_date("15/15/2015", '%d/%m/%Y') 
    #=> nil