我想要一个类似这样的课程:
public interface IDateRecognizer
{
DateTime[] Recognize(string s);
}
日期可能存在于字符串中的任何位置,可能是任何格式。现在,我可以限制美国的文化格式。日期不会以任何方式划界。它们可能在日期的各个部分之间具有任意数量的空白。我的想法是:
我从未使用过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位数年份的处理。考虑到这是异步处理,性能是完全可以接受的。棘手的部分是以有效的方式标记和测试相邻令牌集。
答案 0 :(得分:4)
我会选择一些手动解决方案将输入字符串切割成可管理的大小,让一些正则表达式完成工作。从单元测试开始,这似乎是一个很好的测试。
答案 1 :(得分:1)
我建议你选择正则表达式。我将一个正则表达式(匹配一个日期)放入一个字符串中,并将其中的多个放入一个数组中。然后在运行时创建完整的正则表达式。这使得系统更加灵活。根据您的需要,您可以考虑将不同的date-regex放入(XML)文件/ db。
答案 2 :(得分:0)
识别日期对于Regex来说似乎是一项简单易行的任务。我无法理解你为什么试图避免它。
对于这种情况,你有一组非常有限的语义的ANTLR只是矫枉过正。
虽然表现可能是一个潜在的问题,但我真的怀疑其他选择是否会给你带来更好的表现。
所以我会选择Regex
。