我想从一组字符串中检索日期和其他时间实体。这可以在不解析JAVA中的日期字符串的情况下完成,因为大多数解析器处理有限范围的输入模式。但输入是一个手动输入,在这里,因此含糊不清。
输入可以是:
9月12日| 3月中旬| 12. 2013年9月
9月12日| 9月12日| 2013
9月13日| 12月,9月| 12月,2013年2月
我在Java中找到了许多关于查找日期的答案,但是大多数答案并没有处理如此庞大的输入模式范围。
我尝试使用SimpleDateFormat
类并使用一些parse()函数来检查解析函数是否中断,这意味着它不是日期。我尝试过使用regex
,但我不确定它是否适合这种情况。我还使用ClearNLP来注释日期,但它没有提供可靠的注释集。
获得这些值的最接近方法可能是使用Chain of responsibility
,如下所述。是否有一个库具有一组日期模式。我可以用那个吗?
答案 0 :(得分:2)
解决这个问题的一个简洁的模块化方法是使用链条, 链的每个元素都试图将输入字符串与正则表达式匹配, 如果正则表达式与输入字符串匹配,那么你可以将输入字符串转换为可以提供SimpleDateFormat以将其转换为您喜欢的数据结构(Date?或更适合您需要的不同时间表示)并返回它的东西,如果regexp与链元素不匹配,只是委托给链中的下一个元素。
链中每个元素的责任只是测试字符串的正则表达式,给出结果或者请求链的下一个元素尝试一下。
可以轻松创建和组合链,而无需更改链中每个元素的实现。
最后,结果与@KirkoR响应中的结果相同,“bit”(:D)代码更多,但采用模块化方法。 (我更喜欢try / catch的正则表达式方法)
一些参考:https://en.wikipedia.org/wiki/Chain-of-responsibility_pattern
答案 1 :(得分:1)
你可以实现对你能想到的所有模式可能性的支持,然后记录......好吧,这些都是我的模块支持的模式。然后你可以为所有其他可能性抛出一些RuntimeException
。
然后......以迭代的方式,您可以继续在输入数据上运行模块,并继续添加对更多日期格式的支持,直到它停止提升任何RuntimeException
。
如果你想让它保持相当简单,我认为这是你能做到的最好的。
答案 2 :(得分:1)
是的!我终于提取了各种日期/时间值,可以像以下一样通用:
三月中旬|上个月| 9/11
具体如下:
的精彩图书馆11/11/11 11:11:11
我在JAPE中创建了一个更宽松的注释规则,说“DateEnhanced”'包括某些类型的日期,例如" 9/11或11TH,2001年2月和#34;并在R.H.S上使用Chaining Java正则表达式。 ' DateEnhanced'注释JAPE RULE
,用于过滤一些不需要的输出。
答案 3 :(得分:0)
我可以向您推荐非常好的问题实施方案,不可理解的是:http://koziolekweb.pl/2015/04/15/throw-to-taki-inny-return/
您可以使用谷歌翻译:
那里的代码看起来非常好:
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));
}
答案 4 :(得分:0)
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文件中,我们只需要导入它。