从字符串中提取日期

3
我的问题如下:
我有一个字符串数组,其中包含日期和其他数据。我的日期将具有以下几种格式之一:
1. dd/mm/yyyy 2. dd/mm/yy 3. mm/yy 4. d/m/yy 5. yyyy 6. yy
是否有一种方法可以在字符串中搜索符合这种模式的数字?
此外,如果我能检查dd是否在1到31之间,就会很好,但如果我必须在之后进行检查,也不是太糟糕。

有一种很酷的东西叫做正则表达式;-) - Nathan Ratcliff
1个回答

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。您可能需要考虑使用它来代替固定的日期格式。


1
Match 对象还具有匹配长度以及匹配值。 - Nathan Ratcliff
@soandos,我已经在我的回答中添加了对你问题的回答。如果有更多问题,请随时提出。 - Ray Toal
抱歉问了这么多问题,但是:如果有多个匹配,其他匹配会在哪里呢? - soandos
关于 /-,正则表达式 [/\-] 表示“斜杠或破折号”。这里转义了破折号,因为在方括号内它通常是一个范围指示符。 - Ray Toal
1
你是否将所有选项都放在一个用 | 分隔的正则表达式中?如果是这样,它们将从左到右按顺序进行检查。将最长的正则表达式放在第一位应该就可以解决问题了。请注意,你在评论中提供的示例使用了反斜杠;也许这就是问题所在? - Ray Toal
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接