识别字符串中的日期

时间:2011-03-07 13:15:49

标签: c# parsing antlr text-recognition

我想要一个类似这样的课程:

public interface IDateRecognizer
{
    DateTime[] Recognize(string s);
}

日期可能存在于字符串中的任何位置,可能是任何格式。现在,我可以限制美国的文化格式。日期不会以任何方式划界。它们可能在日期的各个部分之间具有任意数量的空白。我的想法是:

  • ANTLR
  • Regex
  • 手卷

我从未使用过ANTLR,因此我将从零开始学习。我想知道是否有库或代码样本做类似的事情可以启动我。 ANTLR对于如此狭窄的用途来说太重了吗?

我之前使用过Regex很多,但我讨厌它,因为大多数人都讨厌它。

我当然可以手动滚动它,但我宁愿不重新解决已解决的问题。

连连呢?

更新:这是一个例子。鉴于此输入:

  

这是日期11/3/63。这是   另一个:1963年11月3日;和   另一个11月03日,63和一些   更多(11/03/1963)。日期可能是   任何美国格式。他们可能有   像11-2-1963的破折号或者奇怪的额外   像这样的空白:   1963年11月3日,   甚至可能是逗号丢失了   喜欢[11月3日63]但这是一个优势   情况下。

输出应该是七个DateTimes的数组。每个日期都是相同的:11/03/1963 00:00:00。

更新:我完全用手推了这个,我很满意结果。我没有使用Regex,而是使用DateTime.TryParse和自定义DateTimeFormatInfo,这使您可以非常轻松地微调允许的格式以及2位数年份的处理。考虑到这是异步处理,性能是完全可以接受的。棘手的部分是以有效的方式标记和测试相邻令牌集。

3 个答案:

答案 0 :(得分:4)

我会选择一些手动解决方案将输入字符串切割成可管理的大小,让一些正则表达式完成工作。从单元测试开始,这似乎是一个很好的测试。

答案 1 :(得分:1)

我建议你选择正则表达式。我将一个正则表达式(匹配一个日期)放入一个字符串中,并将其中的多个放入一个数组中。然后在运行时创建完整的正则表达式。这使得系统更加灵活。根据您的需要,您可以考虑将不同的date-regex放入(XML)文件/ db。

答案 2 :(得分:0)

识别日期对于Regex来说似乎是一项简单易行的任务。我无法理解你为什么试图避免它。

对于这种情况,你有一组非常有限的语义的ANTLR只是矫枉过正。

虽然表现可能是一个潜在的问题,但我真的怀疑其他选择是否会给你带来更好的表现。

所以我会选择Regex