从文本中提取日期的Java代码

5

在Java中,是否可以从字符串中提取日期?

我有500多个不同数据的字符串。它们中可能会有:
“...从08.23.2011到09.05.2011的期间…”
还有:
“...期间结束于06.09.2011…”。

以上字符串不一定存在,但可能存在。

是否可以提取这3个日期并以日期格式获取它们?


你最好的选择可能是正则表达式,就像Bozho所说的那样。 - Mahmoud Hanafy
5个回答

6

从本质上讲,正则表达式是识别日期和时间段的答案,但有很多很多表达方式,因此如果您想要一个好的解决方案,您可能需要使用现有的、经过良好调整的正则表达式集。然后是第二个解释阶段,这需要比JodaTime提供的更灵活的解析方式。因此,对于一个强大的解决方案,您可能需要使用自然语言处理社区构建的系统之一,例如SUTimeHeidelTimeGUTime


那么不是英语的东西呢? - dranxo
你的选择不太好...最好的是HeidelTime,它支持多种语言,包括德语和西班牙语。我的学生Gabor Angeli即将发表一篇关于多语言学习方法的论文(http://acl2013.org/site/accepted/502.html)...但代码可能不会公开。 - Christopher Manning
谢谢。在搜索后,我除了HeidelTime之外没有找到太多东西。如果你/Gabor想要一些积分,可以在这里回答:http://stackoverflow.com/questions/17241917/is-there-a-multilingual-temporal-expression-tagger-that-can-run-on-hadoop - dranxo

4
您可以先使用正则表达式提取它们:\d{2}\.\d{2}\.\d{4},然后使用SimpleDateFormat解析每个匹配项 - new SimpleDateFormat("dd.MM.yyyy").parse(dateString)

能否使用“正则表达式-正则表达式”和“正则表达式结束”的“关键代码词”作为安全检查,以确保我提取的是正确的日期? - user649542
@user649542,是的,正则表达式可以实现这个功能。 - Bozho

1

首先,我会使用一个简单的正则表达式来获取“可能”的日期,并进行更仔细的解析(最好使用Joda Time)。我会从正则表达式\b\d{2}\.\d{2}\.\d{4}\b 开始(当然还要为 Java 字符串转义)。

(其中 \b 部分匹配单词边界,因此 12345.45.12345 不会匹配。)

你可以使你的正则表达式更具选择性,但是要让它执行所有所需的验证非常困难(试想一下尝试在正则表达式中编码所有闰年规则),所以如果你需要在解析过程中进行验证,那么使正则表达式变得复杂就没有太多意义了。


0
你指的是String而不是文本(这是Java)。
创建一个字符串对象来表示文本,然后将其解析为一个新的DateFormat类
SimpleDateFormat = new SimpleDateFormat("dd.MM.yyyy").parse(yourString)

-2

一个日期模式识别算法,不仅可以识别日期模式,还可以以Java日期格式获取可能的日期。该算法非常快速和轻量级。处理时间是线性的,并且所有日期都在单次遍历中被识别。

算法使用树遍历机制解析日期。树数据结构是自定义创建的,用于构建支持的日期、时间和月份模式。

该算法还承认日期文字之间的多个空格字符。例如,DD DD DD 和 DD DD DD 被视为有效日期。

以下日期模式被视为有效,并可使用此算法进行识别。

dd MM(MM) yy(yy) yy(yy) MM(MM) dd MM(MM) dd yy(yy)

其中M是月份文字,以字母格式表示,如Jan或January

允许在日期之间使用的分隔符包括'/'、'\'、' '、','、'|'、'-'、' '

它还可以识别以下格式的尾随时间模式 hh(24):mm:ss.SSS am / pm hh(24):mm:ss am / pm hh(24):mm:ss am / pm

分辨率时间是线性的,不使用模式匹配或蛮力。该算法基于树遍历,并返回以下三个组件的日期列表: - 在文本中识别的日期字符串 - 转换和格式化的日期字符串 - SimpleDateFormat

使用日期字符串和格式字符串,用户可以根据自己的需求将字符串转换为对象。

算法库可在Maven中央获取。

<dependency>
    <groupId>net.rationalminds</groupId>
    <artifactId>DateParser</artifactId>
    <version>0.3.0</version>
</dependency>

使用此功能的示例代码如下。

 import java.util.List;  
 import net.rationalminds.LocalDateModel;  
 import net.rationalminds.Parser;  
 public class Test {  
   public static void main(String[] args) throws Exception {  
        Parser parser=new Parser();  
        List<LocalDateModel> dates=parser.parse("Identified date :'2015-January-10 18:00:01.704', converted");  
        System.out.println(dates);  
   }  
 }  

输出: [LocalDateModel{originalText=2015-january-10 18:00:01.704, dateTimeString=2015-1-10 18:00:01.704, conDateFormat=yyyy-MM-dd HH:mm:ss.SSS, start=18, end=46}]

详细博客请参见http://coffeefromme.blogspot.com/2015/10/how-to-extract-date-object-from-given.html

完整源代码可在GitHub上获取https://github.com/vbhavsingh/DateParser


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接