【问题标题】:Recognizing strings of Time in ruby识别红宝石中的时间字符串
【发布时间】:2011-03-02 18:29:34
【问题描述】:

这不是什么大问题,真的,完全是出于好奇。

对于我正在开发的程序,我会在特定时间(目前每天一次,可能会更改)将信息写入文件,但这样做的方式是,每条记录信息的时间都很重要。因此,每次我想采集样本并将信息附加到文件时,我首先附加以下内容:

file_out.write Time.now

作为一种简单的方法来准确记住每次写入的时间。

现在我很好奇:有没有办法检查从文件中接收到的字符串(例如“cur_line = file_in.gets”)是否是时间戳?

这不是问题的原因是我当前的方法是简单的正则表达式:

if cur_line =~(/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)/)

而且似乎非常适合我的需要。 (由于项目的性质和我所写内容的格式,我知道文件中不会有其他行包含格式为“{Day} {Month}”的任何文本,所以我停止在那里解析。只是一天或一个月是不够的,会导致误报)。

还有其他可能更漂亮的方法来检查时间戳吗?我不一定会使用其他东西(特别是如果你说“你可以做 X,但它会导致性能受到很大影响”(在这个项目中,比较不是性能的一个重要问题。我猜想差异可能可以忽略不计))。

这只是一件让我觉得很有趣的事情,而且我猜想在 Ruby 中可能会有一些很酷的方法。 :)

【问题讨论】:

    标签: ruby parsing time


    【解决方案1】:

    你可以只做Time.parse cur_line,如果时间不能正确解析,它会返回当前日期。不一定很理想,但Time.parse 非常强大:)

    编辑:做你的正则表达式的有趣方式: 在循环文件之前,声明正则表达式如下:

    expression = Regexp.new("^(#{Time::RFC2822_DAY_NAME.join("|")}) (#{Time::RFC2822_MONTH_NAME.join("|")})")
    

    然后,当您遍历每一行时,执行:cur_line.match(expression)。如果不匹配,这将返回 nil。一种有趣(尽管更长)的方法。

    【讨论】:

    • 所以建议是,如果它返回当前日期(即无法解析),那么我知道这是错误的。所以我比较它返回到 Time.now 在一个除非语句?似乎它会添加很多令人困惑的代码:) Time.parse 占据了我在搜索时发现的大部分主题。在许多情况下看起来是一个非常有用的工具,但在这里看起来有点混乱。不过,对于其他情况,绝对要牢记这一点。
    • @DRobinson - 可能留给你肯定你正在解析的是时间戳的情况。我想您可以将Time.parse 与您的正则表达式混合使用,其中正则表达式会找到潜在时间戳的行,而Time.parse 用于解析该时间戳。那么,为了验证,任何以{month} {day} 开头的行都保证是时间戳?
    • 正是我认为这可能会有所帮助的那种事情。不幸的是,到目前为止,在这个项目中,我不需要在找到日期后以任何方式实际使用日期,我只需将它扔到一个数组中并在它标记的数据符合某些标准时显示它(即也许是部分数据增加了 20%,我只想说增加发生在哪一天)。当然,为此我只需要一个简单的“放置”并且不在乎它是否被计算机视为日期或字符串。在许多情况下都是一个很棒的工具,但恐怕不是我的特殊工具:)谢谢!
    • 所以不是更容易,甚至更短,但我编辑了我的答案,包括另一种“有趣”的方式来做你的正则表达式
    【解决方案2】:

    您可以尝试通过chronicDate.parse 运行这些行,但我敢打赌这两种方法都比使用正则表达式效率低。这种效率的影响完全取决于您必须解析多少文本。

    【讨论】:

      猜你喜欢
      • 2010-11-29
      • 1970-01-01
      • 2014-02-11
      • 2011-01-21
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多