5

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

输入可以是:

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

9月12日|9月12日| 2013

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

我已经阅读了很多关于在 Java 中查找日期的答案,但其中大多数都没有处理如此庞大的输入模式范围。

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

获得这些值的最接近的方法可能是使用 a Chain of responsibility,如下所述。是否有一个库有一组日期模式。也许我可以使用它?

4

5 回答 5

2

解决此问题的一种干净且模块化的方法是使用链,链的每个元素都尝试将输入字符串与正则表达式匹配,如果正则表达式与输入字符串匹配,则您可以将输入字符串转换为可以提供的东西SimpleDateFormat 将其转换为您喜欢的数据结构(日期?或更适合您需要的不同时间表示)并返回它,如果正则表达式与链元素不匹配,则仅代表链中的下一个元素。

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

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

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

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

于 2015-10-13T09:40:17.747 回答
1

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

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

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

于 2015-10-13T09:14:20.540 回答
1

是的!我终于提取了各种日期/时间值,它们可以像以下那样通用:

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

具体到:

11/11/11 11:11:11

这终于发生了,因为来自GATEJAPE的很棒的库

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

于 2015-10-15T13:35:32.953 回答
0

我可以向您推荐非常好的解决问题的方法,不幸的是波兰语: 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=

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

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));                                         
}
于 2015-10-13T09:27:21.273 回答
0
    mark.util.DateParser dp = new DateParser();
    ParsePositionEx parsePosition = new ParsePositionEx(0);
    Date startDate = dp.parse("12.September.2013", parsePosition);
    System.out.println(startDate);

输出:2013 年 9 月 12 日星期四 17:18:18 IST

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

于 2016-01-20T11:52:10.380 回答