从字符串ruby中提取日期

时间:2015-10-10 19:22:57

标签: ruby string

我有这个字符串:

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

我想提取的日期是" 06/04 / 2015"。我如何在红宝石中这样做? 我试图做这样的事情:

str[-1..-11]

但没有奏效。有什么建议吗?谢谢!

5 个答案:

答案 0 :(得分: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)并特别从中获取日期。

答案 1 :(得分:2)

Date有一个解析方法,恰好可以工作。

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)>

答案 2 :(得分:1)

str [-11 ..- 2]如果日期的位置没有改变

答案 3 :(得分:1)

我同意Piccolo的评论。这是一个简单的正则表达式,您可以在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 > 

答案 4 :(得分: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