Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 基于if-there';这是一个有效的日期_Ruby_Gsub - Fatal编程技术网

Ruby 基于if-there';这是一个有效的日期

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_

我有5个字符串:

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
可能返回超出范围的值。