2

我想要一个像这样的课程:

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

日期可能存在于字符串中的任何位置,并且可能是任何格式。目前,我可以仅限于美国文化格式。日期不会以任何方式分隔。它们可能在日期的各个部分之间有任意数量的空格。我的想法是:

  • ANTLR
  • 正则表达式
  • 手卷

我从未使用过 ANTLR,所以我将从头开始学习。我想知道是否有库或代码示例可以做类似的事情,可以让我开始。ANTLR 对于如此狭窄的用途来说是否太重了?

我以前使用过很多正则表达式,但我讨厌它,因为大多数人讨厌它。

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

建议?

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

这是 63 年 11 月 3 日的日期。这是另一个:1963 年 11 月 3 日;另一个是 63 年 11 月 3 日和更多(1963 年 11 月 3 日)。日期可以是任何美国格式。他们可能有像 11-2-1963 这样的破折号或像这样的奇怪的额外空白:1963 年 11 月 3 日,甚至可能像 [Nov 3 63] 那样缺少逗号,但这是一个边缘情况。

输出应该是一个包含七个日期时间的数组。每个日期都相同:11/03/1963 00:00:00。

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

4

3 回答 3

4

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

于 2011-03-07T13:19:26.743 回答
1

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

于 2011-03-07T13:26:16.320 回答
0

对于 Regex 而言,识别日期似乎是一项简单而简单的任务。我不明白你为什么要试图避免它。

在这种情况下,您的语义集非常有限,ANTLR 只是矫枉过正。

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

所以我会去Regex

于 2011-03-07T13:21:55.993 回答