2011-03-07 47 views
2

我想一类是这样的:识别日期字符串中的

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

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

  • ANTLR
  • 正则表达式
  • 手卷

我从来没有使用ANTLR,所以我会从头开始学习。我想知道是否有类似的库或代码示例可以启动我。 ANTLR对于如此狭窄的用途来说太重了吗?

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

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

对此提出建议?

UPDATE:这里是一个例子。给定此输入:

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

输出应该是一个由七个DateTime组成的数组。每个日期都是一样的:11/03/1963 00:00:00。

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

回答

4

我会去一些手滚解决方案将输入字符串切成可管理的大小,让一些正则表达式来完成这项工作。这对于单元测试来说似乎是一个很好的测试。

+0

+1单元测试建议 –

0

对于正则表达式来说,识别日期似乎是一个简单易行的任务。我不明白你为什么试图避免它。

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

虽然性能可能是一个潜在的问题,但我真的怀疑,如果其他选项会给你更好的表现。所以我会去Regex

+0

任何建议如何开始?我希望能够处理如下字符串:“这是一个日期11/3/09和另一个2010年9月18日,另一个是99年9月2日和更多日期01/01/1966在任何美国格式1月33日,2010里面有奇怪的额外空白,甚至可能是逗号像10月3日99一样缺失。所以我想用6个日期返回DateTime []。 –

+0

更新你的问题,并带来一个你想到的日期列表,我们将建议正则表达式模式。很明显,需要定义处理变体的任何要求,以便它可以添加到正则表达式中。 – Aliostad

+0

已更新。感谢Aliostad。 –

1

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

相关问题