我有这个字符串:
Rep. Barletta, Lou [R-PA-11] (Introduced 06/04/2015)
我想提取的日期是" 06/04 / 2015"。我如何在红宝石中这样做? 我试图做这样的事情:
str[-1..-11]
但没有奏效。有什么建议吗?谢谢!
答案 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