给定一个特定的日期,是否有一种方法可以在不知道日期是以哪种格式书写的情况下在自由文本文档中搜索该日期?

Given a particular date, is there a way to search for that date in a free text document without knowing in which format the date is written?

本文关键字:日期 自由 情况下 书写 格式 搜索 文档 文本 方法 一个 是否      更新时间:2023-09-26

假设我有一个特定的日期,比如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

…这将是处理日期的数字表示的好方法。这样一来,Month的名字就无从得知了。由于1,01,Jan和January都代表一年的第一个月,我想知道大量的排列是否在其他地方得到了很好的处理。

我不知道有任何预先存在的解决方案,但是编写自己的解决方案并不复杂。创建一个包含要搜索的日期格式的数组,然后简单地遍历这些格式,格式化日期并搜索文档:

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

Update:一种更复杂、更有效的方法是将搜索字符串转换为Regexp:

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