簡體   English   中英

從字符串紅寶石中提取日期

[英]Extract Date from string ruby

我有這個字符串:

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

我想提取日期為“ 06/04/2015”。 如何在紅寶石中做到這一點? 我試圖做這樣的事情:

str[-1..-11]

但沒有工作。 有什么建議嗎? 謝謝!

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)並特別從中獲取日期。

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

str [-11 ..- 2]如果日期的位置不變

我同意短笛的評論。 這是一個可以在irb中嘗試的簡單正則表達式。 我建議在irb中進行實驗,以學習一些基本的Ruby正則表達式

例如,/。 /.+([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 > 

@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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM