从字符串中提取日期

时间:2011-08-14 04:38:51

标签: c# string pattern-matching

我的问题如下:

我有一个包含日期和其他数据的字符串数组。我的日期将采用以下几种格式之一:

  1. dd / mm / yyyy
  2. DD / MM / YY
  3. MM / YY
  4. d / M /日
  5. YYYY
  6. YY
  7. 有没有办法在字符串中搜索符合该字符串的数字?

    另外,如果我可以检查dd是否介于1和31之间等,那将会很好,但如果我之后不得不这样做,那就不会那么糟糕了。

1 个答案:

答案 0 :(得分:8)

每个都对应一个正则表达式。

以下是每个的正则表达式:

  • dd / mm / yyyy ==> \b(?:[012][1-9]|3[01])/(?:0[1-9]|1[012])/\d{4}\b
  • dd / mm / yy ==> \b(?:[012][1-9]|3[01])/(?:0[1-9]|1[012])/\d{2}\b
  • mm / yy ==> \b(?:0[1-9]|1[012])/\d\d\b
  • d / m / yy ==> \b[1-9]/[1-9]/\d\d\b
  • yyyy ==> \b\d{4}\b
  • yy ==> \b\d\d\b

当然,您可以通过不同方式将它们组合在一起。你甚至可以制作一个超级正则表达式。

但最后一个相当有趣。我可以想象一下你的文本中可能有一个普通的旧数字,例如42可能实际上并不对应一年。我猜你仍然可以对其进行后处理。

快乐的复兴。

<强>附录

回答评论中的一些问题:

  1. 是的,它适用于字符串的开头和结尾,因为\b字边界,其中包含来自字符(字母,数字和字母)的所有过渡(下划线)到非单词字符,反之亦然,包括字符串的开头和结尾。

  2. 要查看测试,请参阅此处:http://jsfiddle.net/wRufK/。是的我知道这是用JavaScript而不是C#,但是jsfiddle是一种非常方便的方式来显示代码。但是有一些区别 - 在C#中我们使用Regex.match并且JavaScript正则表达式有额外的反斜杠来逃避内部正斜杠。

  3. indexOf 可能过度杀伤,具体取决于应用程序。如果要查找所有匹配项,请参阅http://msdn.microsoft.com/en-us/library/twcw2f1c.aspx以获取有关重复匹配的信息。您还可以修改正则表达式以进行捕获。

  4. 由于您的日期可以是上述任何一种形式,也可能是其他形式,因此单个正则表达式可能更为可取。这里有一个非常灵活的日期查找器:http://www.regular-expressions.info/dates.html。您可能需要考虑它而不是修复精确集。