1

我正在尝试编写一个程序,该程序将在可以解释为日期的字符串中查找一系列数字。为此,我编写了一个正则表达式,运行如下:

Dim m As MatchCollection = Regex.Matches(_string, "[0-9]{1,4}[-_ ]?[0-9]{1,2}([-_ ]?[0-9]{2,4})?")

现在,当我给它一些像“4_2_2012_13_39”这样的奇怪字符串时,我希望它返回以下九个匹配项:

  1. 4_2
  2. 4_2_20
  3. 4_2_2012
  4. 2_20
  5. 2012
  6. 2012_13_39
  7. 12_13
  8. 12_13_39
  9. 13_39

(我有一个次要步骤,将丢弃数字 6 和 9,因为在一个月值的范围内没有任何数字。)事实上,我只得到两个匹配项:“4_20_2012”和“13_39”。我认为它试图不在两场比赛中使用相同的字符。有没有办法我可以坚持不这样做?感谢您的任何帮助。

4

2 回答 2

1

为什么需要可以解释为日期但不是有效日期的字符串?2012_13_39 不是有效日期。

您可以为每种日期类型运行独立的正则表达式

这将查找从 19 或 20 开始的 4 位数字年份
。负向回顾和展望是匹配任何非数字来识别独立数字

(?<!\d)(20|19)\d\d(?!\d) 

这是寻找月日

(?<!\d)1?\d_[1-3]?\d(?!\d)

但你可能会更加严格,因为这允许 19/39

年初的年份

(?<!\d)(20|19)\d\d_1?\d_[1-3]?\d(?!\d)

我不会为你构建它们,但这是实现它的工具
(?!\d) 应该作为一个边界

于 2013-08-02T22:10:05.587 回答
0

它会给你每个起点的最长匹配,而不是每个可能的匹配(就像匹配abcdef.*返回 match abcdef,不是所有可能的子字符串(所以不是aor for bcd

于 2013-08-05T18:05:36.973 回答