使用javascript查找文本中不同格式的日期

时间:2018-08-22 07:40:22

标签: javascript

我有一堆段落,其中的日期格式不同。例如: 1776年5月1日,在长岛战役中参加战斗的美军士兵 在哈利法克斯(Halifax)团聚后,威廉·豪(William Howe)决定将战斗带给美国人。[139]他于1776年6月5日起航,并于1949年7月2日在纽约港入口附近的史坦顿岛上开始登陆部队。由于军事情报不力,华盛顿将其军队分散到曼哈顿岛和长岛西部的东河上。 ,[140]而美国人拒绝进行和平谈判的非正式尝试。[141]在8月27日,豪豪森超越华盛顿,将他逼回布鲁克林高地02-03-2019。 Howe限制2012年1月2日追随他的下属,而选择围困2014年2月3日,华盛顿。[142]

在示例段落中,有一些日期,例如

1776年5月1日

1776年6月5日

1949年7月2日

2012年1月2日

2014年2月3日

02-03-2019

我需要从本段中提取这些日期。我发现有一个python包在做这样的事情:datefinder 希望有人能对我有所帮助,或者请告诉我还有其他方法可以实现它。 感谢advace

1 个答案:

答案 0 :(得分:1)

您可以这样做。

这不是最佳选择,可能会检测到非日期字符串/未检测到日期

但它可以与您给出的示例一起使用

let text = "I've a bunch of paragraph, which have dates in it in different format. for Example: American soldiers in combat at the Battle of Long Island, 1 May, 1776 After regrouping at Halifax, William Howe determined to take the fight to the Americans.[139] He set sail in 5 June 1776 and began landing troops on Staten Island near the entrance to New York Harbor on July 2 1949. Due to poor military intelligence, Washington split his army to positions on Manhattan Island and across the East River in western Long Island,[140] and an informal attempt to negotiate peace was rejected by the Americans.[141] On 06 August 27, Howe outflanked Washington and forced him back to Brooklyn Heights 02-03-2019. Howe restrained 01/02/2012 his subordinates from pursuit, opting to besiege 02/03/2014 Washington instead.[142] test 2 1254"

let dates = [];

let words = text.split(" ")

// these char if left in string cannot be send to date
// Maybe you'll need to add some as you enconter them
let forbiddenChar = /[.]/g

// for each word
for (let i in words) {
  // if it contains 4 consecutive number (something looking like a year)
  if (words[i].match(/.*[0-9]{4}.*/)) {
    // if the "year" is not at the start (full date)
    if (words[i].search(/[0-9]{4}/) !== 0) {
      words[i] = words[i].replace(/[-]/g, "/").replace(forbiddenChar, " ");
      
      let date = new Date(words[i])
        
      if (date.toString() != "Invalid Date") {
        dates.push(date)
      }
    // the "year" is at the start of word
    } else {
      if (i >= 2) {
        // the other part of the date appear before the year
        let date = `${words[i - 2]} ${words[i - 1]} ${words[i]}` 
        date = new Date(date.replace(forbiddenChar, " "))
        
        if (date.toString() != "Invalid Date") {
          dates.push(date)
        }
      }
    }
  }
}

console.log(dates)