如何从文本中检索各种日期和时间值

我想从一组字符串中检索日期和其他时间实体。 这可以在不解析JAVA中的日期字符串的情况下完成,因为大多数解析器处理有限范围的输入模式。 但输入是一个手动输入,在这里,因此含糊不清。

输入可以是:

9月12日| 3月中旬| 12. 2013年9月

9月12日| 9月12日| 2013

9月13日| 9月12日,2013年2月12日

我在Java中找到了许多关于查找日期的答案,但是大多数答案并没有处理如此巨大的输入模式。

我已经尝试使用SimpleDateFormat类并使用一些parse()函数来检查解析函数是否中断,这意味着它不是一个日期。 我试过使用regex但我不确定它是否适合这种情况。 我还使用ClearNLP来注释日期,但它没有给出可靠的注释集。

获得这些价值观的最接近方法可能是使用如下所述Chain of responsibility 。 是否有一个库具有一组日期模式。 我可以用那个吗?

这个问题的一个简洁和模块化的方法是使用一个链,链的每个元素都试图将输入字符串与正则表达式匹配,如果正则表达式匹配输入字符串,那么你可以将输入字符串转换为可以输入字符串的东西。 SimpleDateFormat将它转换为您喜欢的数据结构(Date?或更适合您需要的不同时态表示)并返回它,如果正则表达式与链元素不匹配则只委托给链中的下一个元素。

链的每个元素的责任只是测试正则表达式对字符串,给出结果或要求链的下一个元素尝试。

可以轻松创建和组合链,而无需更改链中每个元素的实现。

最后,结果与@KirkoR响应中的结果相同,“bit”(:D)代码更多,但采用模块化方法。 (我更喜欢try / catch之类的正则表达式方法)

一些参考: https : //en.wikipedia.org/wiki/Chain-of-responsibility_pattern

你可以实现对你能想到的所有模式可能性的支持,然后记录下来……好吧,这些都是我的模块支持的模式。 然后,您可以为所有其他可能性抛出一些RuntimeException

然后……以迭代的方式,您可以继续在输入数据上运行模块,并继续添加对更多日期格式的支持,直到它停止引发任何RuntimeException

我认为如果你想让它保持相当简单,你可以做到最好。

是! 我最终提取了各种日期/时间值,可以像以下一样通用:

三月中旬| 上个月| 9月11日

具体如下:

11/11/11 11:11:11

这最终发生在GATE和JAPE的令人敬畏的库中

我在JAPE中创建了一个更宽松的注释规则,称’DateEnhanced’包括某些类型的日期,如“9/11或11TH,2001年2月”,并在’DateEnhanced’注释JAPE RULE RHS上使用了一个链接 Java正则表达式,过滤一些不需要的输出。

我可以向你推荐你的问题非常好的实现,不可思议的波兰语: http : //koziolekweb.pl/2015/04/15/throw-to-taki-inny-return/

你可以使用谷歌翻译:

https://translate.google.pl/translate?sl=pl&tl=en&js=y&prev=_t&hl=en&ie=UTF-8&u=http%3A%2F%2Fkoziolekweb.pl%2F2015%2F04%2F15%2Fthrow-to-taki- INNY回报和编辑文本=

那里的代码看起来非常好:

 private static Date convertStringToDate(String s) { if (s == null || s.trim().isEmpty()) return null; ArrayList patterns = Lists.newArrayList(YYYY_MM_DD_T_HH_MM_SS_SSS, YYYY_MM_DD_T_HH_MM_SS , YYYY_MM_DD_T_HH_MM , YYYY_MM_DD); for (String pattern : patterns) { try { return new SimpleDateFormat(pattern).parse(s); } catch (ParseException e) { } } return new Date(Long.valueOf(s)); } 

使用DateNormalizer PR或者你也可以使用mark.util.DateParser,它由GATE开发人员中的DateNormalizer PR使用。

  mark.util.DateParser dp = new DateParser(); ParsePositionEx parsePosition = new ParsePositionEx(0); Date startDate = dp.parse("12.September.2013", parsePosition); System.out.println(startDate); 

输出:Thu Sep 12 17:18:18 IST 2013

mark.util.Dateparser是DateNormalizer PR使用的库的一部分。 所以在Jape文件中,我们只需要导入它。