Ruby 基于if-there';这是一个有效的日期
我有5个字符串:Ruby 基于if-there';这是一个有效的日期,ruby,gsub,Ruby,Gsub,我有5个字符串: MO170915C00075000 GILD1514H117 9ZZZFD898 AHMIQ 894990415 前两个字母的有效日期介于第一组数字和下一个字母(例如:C)之间 如果我可能会问,如何根据其中的日期(需要确定它们包含在第一组字母之后、单个字符之前的日期)选择前两个字符串,然后正确设置日期格式 对于第一个,我可以使用下面的GSub获得日期: ("20" + @ticker.gsub(/(\w+?)(\d{6})([a-z])\d+/i,'\2')).to_
MO170915C00075000
GILD1514H117
9ZZZFD898
AHMIQ
894990415
前两个字母的有效日期介于第一组数字和下一个字母(例如:C)之间
如果我可能会问,如何根据其中的日期(需要确定它们包含在第一组字母之后、单个字符之前的日期)选择前两个字符串,然后正确设置日期格式
对于第一个,我可以使用下面的GSub获得日期:
("20" + @ticker.gsub(/(\w+?)(\d{6})([a-z])\d+/i,'\2')).to_date
您可以使用查看可以通过找到哪些信息
如果没有任何说明,你基本上是在黑暗中拍摄的。由于逻辑是如此模糊,它无法神奇地使用任何奇怪的字符串作为输入:
require 'date'
weird_dates = %w(MO170915C00075000 MA20172115C00075000 GILD1514H117 9ZZZFD898 AHMIQ 894990415)
weird_dates.each do |date_str|
date_hash = Date._parse(date_str)
puts date_str
puts " #{date_hash}"
if date_hash[:year] && date_hash[:mon] && date_hash[:mday]
print " It looks like a date"
begin
date = Date.parse(date_str)
puts " : #{date}"
rescue ArgumentError
puts " but it's not a valid one!"
end
else
puts " Sorry, not enough information"
end
puts
end
它输出:
MO170915C00075000
{:year=>2017, :mon=>9, :mday=>15}
It looks like a date : 2017-09-15
MA20172115C00075000
{:year=>2017, :mon=>21, :mday=>15}
It looks like a date but it's not a valid one!
GILD1514H117
{:hour=>1514, :min=>117}
Sorry, not enough information
9ZZZFD898
{:yday=>898}
Sorry, not enough information
AHMIQ
{}
Sorry, not enough information
894990415
{}
Sorry, not enough information
如果您知道确切的输入格式,您应该使用。您可以使用查看可以通过找到哪些信息
如果没有任何说明,你基本上是在黑暗中拍摄的。由于逻辑是如此模糊,它无法神奇地使用任何奇怪的字符串作为输入:
require 'date'
weird_dates = %w(MO170915C00075000 MA20172115C00075000 GILD1514H117 9ZZZFD898 AHMIQ 894990415)
weird_dates.each do |date_str|
date_hash = Date._parse(date_str)
puts date_str
puts " #{date_hash}"
if date_hash[:year] && date_hash[:mon] && date_hash[:mday]
print " It looks like a date"
begin
date = Date.parse(date_str)
puts " : #{date}"
rescue ArgumentError
puts " but it's not a valid one!"
end
else
puts " Sorry, not enough information"
end
puts
end
它输出:
MO170915C00075000
{:year=>2017, :mon=>9, :mday=>15}
It looks like a date : 2017-09-15
MA20172115C00075000
{:year=>2017, :mon=>21, :mday=>15}
It looks like a date but it's not a valid one!
GILD1514H117
{:hour=>1514, :min=>117}
Sorry, not enough information
9ZZZFD898
{:yday=>898}
Sorry, not enough information
AHMIQ
{}
Sorry, not enough information
894990415
{}
Sorry, not enough information
如果您知道确切的输入格式,则应使用。代码
require 'date'
def extract_dates(arr)
arr.each_with_object([]) do |str,a|
s = str[/\d+/] || ''
a <<
case s.size
when 8
[convert_to_time(s, 4, 2, 2)]
when 7
[convert_to_time(s, 4, 2, 1), convert_to_time(s, 4, 1, 2)]
when 6
[convert_to_time(s, 4, 1, 1), convert_to_time(s, 2, 2, 2)]
when 5
[convert_to_time(s, 2, 2, 1), convert_to_time(s, 2, 1, 2)]
when 4
[convert_to_time(s, 2, 1, 1)]
else
[]
end.compact
end
end
def convert_to_time(s, y, m, d)
ss = s.dup
ss.insert(0, "20") if y == 2
ss.insert(4, "0") if m == 1
ss.insert(6, "0") if d == 1
DateTime.strptime(ss, "%Y%m%d") rescue nil
end
需要“日期”
def提取日期(arr)
arr.each_with_object([])do | str,a|
s=str[/\d+/]||”
代码
require 'date'
def extract_dates(arr)
arr.each_with_object([]) do |str,a|
s = str[/\d+/] || ''
a <<
case s.size
when 8
[convert_to_time(s, 4, 2, 2)]
when 7
[convert_to_time(s, 4, 2, 1), convert_to_time(s, 4, 1, 2)]
when 6
[convert_to_time(s, 4, 1, 1), convert_to_time(s, 2, 2, 2)]
when 5
[convert_to_time(s, 2, 2, 1), convert_to_time(s, 2, 1, 2)]
when 4
[convert_to_time(s, 2, 1, 1)]
else
[]
end.compact
end
end
def convert_to_time(s, y, m, d)
ss = s.dup
ss.insert(0, "20") if y == 2
ss.insert(4, "0") if m == 1
ss.insert(6, "0") if d == 1
DateTime.strptime(ss, "%Y%m%d") rescue nil
end
需要“日期”
def提取日期(arr)
arr.each_with_object([])do | str,a|
s=str[/\d+/]||”
a有效日期的定义是什么?有效日期是11115
?是2015年11月1日还是2015年1月11日?或者只是提取被字符包围的数字?ruby中没有方法String#u date
。我投了否决票,因为问题不清楚(GILD1514H117
?)中的日期是什么,因为你看到了@Aetherus的问题,但选择不回答它。@CarySwoveland-这里是凌晨5点,所以我道歉,因为我睡着了。。。我不知道你为什么假设我在一个多小时前看到了他的答案。有效日期的定义是什么?有效日期是11115
吗?是2015年11月1日还是2015年1月11日?或者只是提取被字符包围的数字?ruby中没有方法String#u date
。我投了否决票,因为问题不清楚(GILD1514H117
?)中的日期是什么,因为你看到了@Aetherus的问题,但选择不回答它。@CarySwoveland-这里是凌晨5点,所以我道歉,因为我睡着了。。。我不知道你为什么假设我在一个多小时前看到了他的答案。@CarySwoveland:谢谢。我不知道日期。_parse
可能返回超出范围的值。@CarySwoveland:谢谢。我不知道Date.\u parse
可能返回超出范围的值。