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

问题描述 投票:5回答:5

我想从一组字符串中检索日期和其他时间实体。这可以在不解析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。是否有一个库具有一组日期模式。我可以用那个吗?

java date nlp gate temporal
5个回答
2
投票

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

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

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

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

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


1
投票

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

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

如果你想让它保持相当简单,我认为这是你在这里做的最好的。


1
投票

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

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

具体如下:

11/11/11 11:11:11

这最终发生的原因是来自GATEJAPE的令人敬畏的图书馆

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


0
投票

我可以向你推荐你的问题非常好的实现,不幸的是在波兰语:JAPE RULE

您可以使用谷歌翻译:

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-return&edit-text=

0
投票
private static Date convertStringToDate(String s) {                           
    if (s == null || s.trim().isEmpty()) return null;                         
    ArrayList<String> 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));                                         
}

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

mark.util.Dateparser是 mark.util.DateParser dp = new DateParser(); ParsePositionEx parsePosition = new ParsePositionEx(0); Date startDate = dp.parse("12.September.2013", parsePosition); System.out.println(startDate); 使用的库的一部分。所以在Jape文件中,我们只需要导入它。

© www.soinside.com 2019 - 2024. All rights reserved.