如何在字符串中获取所有可能的正则表达式匹配项

时间:2013-08-02 19:19:05

标签: .net regex vb.net

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

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
  10. (我有一个第二步,它将丢弃数字6和9,因为月份值范围内没有任何数字。)实际上,我只得到两个匹配:“4_20_2012”和“13_39”。我认为它试图不在两场比赛中使用相同的角色。有没有办法可以坚持不这样做?谢谢你的帮助。

    罗布

2 个答案:

答案 0 :(得分: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)应该作为边界

答案 1 :(得分:0)

它会为每个起点提供最长的匹配,而不是每个可能的匹配(就像abcdef.*的匹配将返回匹配abcdef,而不是所有可能的子字符串(所以不是afbcd