2

假设我有一个特定的日期,例如January 10, 2013.

我希望能够搜索文本或 html 文档以查看它是否包含对该日期的引用。我想说明日期采用多种格式,例如:

1/10/2013  
01/10/13  
2013-01-10
10-Jan-2013  
January 10, 2013  
Jan 10, 2013

... 都应该为January 10, 2013.

我认识到交换日月顺序可能会有问题,但在这种情况下我愿意接受误报结果,这意味着:

01-10-2013
10-01-2013

January 10, 2013...在我的情况下都是可以接受的。

是否存在用任何语言实现的既定算法来执行这种通用但非平凡的搜索?我的偏好是 Ruby 或 JavaScript,但我会对任何经过深思熟虑的示例感兴趣。附录#1

我看到这段代码:

def validate_date(date_str)
  valid_formats = ["%m/%d/%Y", "%m/%d/%Y %I:%M %P"] 
  #see http://www.ruby-doc.org/core-1.9.3/Time.html#method-i-strftime for more

  valid_formats.each do |format|
    valid = Time.strptime(date_str, format) rescue false

    return true if valid
  end

  return false
end

在这里

...这将是处理日期数字表示的好方法。这使得月份名称下落不明。1、01、Jan 和 January 都代表一年中的第一个月,我想知道是否在其他地方已经很好地处理了大量的排列。

4

1 回答 1

2

我不知道任何预先存在的解决方案,但编写自己的解决方案并不复杂。制作您想要搜索的日期格式数组,然后简单地遍历格式,格式化您的日期并搜索您的文档:

require 'date'

formats = ["%-m/%e/%Y",
           "%m/%d/%Y",
           "%Y-%m-%d",
           "%d-%b-%Y",
           "%B %d, %Y",
           "%b %d, %Y"]

d = Date.new(2013, 1, 10)

formats.each do |format|
  search_string = d.strftime(format)
  # Do your search for `search_string`
end

更新:一种更复杂、更有效的方法是将搜索字符串转换为正则表达式:

require 'date'

formats = ["%-m/%e/%Y",
           "%m/%d/%Y",
           "%Y-%m-%d",
           "%d-%b-%Y",
           "%B %d, %Y",
           "%b %d, %Y"]

d = Date.new(2013, 1, 10)

regex = Regexp.union(formats.map{|f| Regexp.new(Regexp.quote(d.strftime(f)))})
# Search document for regex
于 2013-06-10T18:48:38.857 回答