【问题标题】:Recognize Dates In A String识别字符串中的日期
【发布时间】:2011-03-07 13:15:48
【问题描述】:

我想要这样的课程:

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

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

  • ANTLR
  • 正则表达式
  • 手卷

我从未使用过 ANTLR,所以我会从头开始学习。我想知道是否有库或代码示例可以做类似的事情,可以让我开始。 ANTLR 是不是太重了,不适合这么窄的用途?

我以前使用过很多正则表达式,但出于大多数人讨厌它的所有原因,我讨厌它。

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

建议?

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

这是 63 年 11 月 3 日的日期。这是 另一个:1963年11月03日;和 另一个是 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 位数年份。考虑到这是异步处理的,性能是完全可以接受的。棘手的部分是以有效的方式标记和测试相邻标记集。

【问题讨论】:

    标签: c# parsing antlr text-recognition


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        对于这种语义非常有限的情况,ANTLR 是多余的。

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

        所以我会选择Regex

        【讨论】:

        • 任何建议如何开始?我希望能够处理这样的字符串:“这是一个日期 09 年 11 月 3 日,另一个日期是 2010 年 9 月 18 日,另一个日期是 99 年 9 月 2 日,以及更多日期 1966 年 1 月 1 日,任何美国格式 1 月 33 日, 2010 里面有奇怪的额外空格,甚至可能缺少逗号,比如 Oct 3 99"。所以我希望它返回带有 6 个日期的 DateTime[]。
        • 更新您的问题并提供您想到的日期列表,我们将建议正则表达式模式。很明显,需要定义处理变体的任何要求,以便将其添加到正则表达式中。
        猜你喜欢
        • 2018-12-25
        • 2016-02-06
        • 1970-01-01
        • 2020-08-20
        • 1970-01-01
        • 1970-01-01
        • 2023-01-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多