Joe*_*oel 22 java date classification
我需要能够识别日期字符串.如果我无法区分月份和日期(例如12/12/10)并不重要,我只需要将字符串分类为日期,而不是将其转换为Date对象.所以,这实际上是一个分类而不是解析问题.
我会有一些文字,例如:
"bla bla bla bla 12 Jan 09 bla bla bla 01/04/10 bla bla bla"
我需要能够识别每个日期字符串的开始和结束边界.
我想知道是否有人知道任何可以做到这一点的java库.到目前为止,我的google-fu还没有提出任何建议.
更新:我需要能够识别出最广泛的表示日期的方法.当然,天真的解决方案可能是为每种可想到的格式编写一个if语句,但是模式识别方法,使用训练有素的模型,理想情况下是我所追求的.
您可以在Java中循环所有可用的日期格式:
for (Locale locale : DateFormat.getAvailableLocales()) {
for (int style = DateFormat.FULL; style <= DateFormat.SHORT; style ++) {
DateFormat df = DateFormat.getDateInstance(style, locale);
try {
df.parse(dateString);
// either return "true", or return the Date obtained Date object
} catch (ParseException ex) {
continue; // unperasable, try the next one
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这不会考虑任何自定义日期格式.
可能有助于您完成任务的规则:
Jan或January.搜索时,它必须不区分大小写,因为fEBruaRy也是一个月,虽然输入它的人一定是醉了.如果你打算搜索非英语月份,还需要一个数据库,因为没有启发式的工具会发现"Wrzesień"在9月份已经很好了.0*,其中*可以是1-9的字符串是可接受的.{-,_, ,:,/,\,.,','},但*可能是上述集合中2或3个元素的组合.您必须再次选择可接受的分隔符.10?20?1999可能是一个有着奇怪优雅感的人的有效日期.10/20/1999也可以是一个有效的日期,但是10_/20_/1999将是一个非常奇怪的日期.我认为这些对于"天真"的分类来说已经足够了,语言专家可能会帮助你更多.
现在,您的算法的想法.速度无关紧要.同一个字符串可能有多个传递.优化何时开始重要.如果您怀疑自己找到了日期字符串,请将其存储在"安全"的某个地方ListOfPossibleDates并再次进行检查,使用从1到8的组合使用更严格的规则.当您认为日期字符串有效时,请将其提供给该Date课程,以确定它是否真的有效.1999年3月32日无效,当您将其转换为Date可理解的格式时.
一个重要的反复出现的模式是lookbehind和lookaround.当您认为找到有效的实体(日,月,年)时,您将不得不看到背后的内容.基于堆栈的机制或递归可能对此有所帮助.
脚步:
由于确实有无数的可能性,你将无法捕捉到它们.一旦找到了您认为可能再次发生的模式,将其存储在某处,您可以将其用作传递其他字符串的正则表达式.
我们举个例子吧"bla bla bla bla 12 Jan 09 bla bla bla 01/04/10 bla bla bla".提取第一个日期后12 Jan 09,然后使用该字符串的其余部分("bla bla bla 01/04/10 bla bla bla")并再次应用上述所有步骤.这样你就可以确定你没有错过任何东西.
我希望这些建议至少可以提供一些帮助.如果没有一个库可以为你做所有这些肮脏(和更多)的步骤,那么你就有了艰难的道路.祝好运!