我正在尝试编写一个程序,该程序将在字符串中查找可以解释为日期的一系列数字。为此,我写了一个正则表达式,我这样运行:
Dim m As MatchCollection = Regex.Matches(_string, "[0-9]{1,4}[-_ ]?[0-9]{1,2}([-_ ]?[0-9]{2,4})?")
现在,当我给它一些奇怪的字符串如“4_2_2012_13_39”时,我希望它会返回以下九场比赛:
(我有一个第二步,它将丢弃数字6和9,因为月份值范围内没有任何数字。)实际上,我只得到两个匹配:“4_20_2012”和“13_39”。我认为它试图不在两场比赛中使用相同的角色。有没有办法可以坚持不这样做?谢谢你的帮助。
罗布
答案 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
,而不是所有可能的子字符串(所以不是a
或f
或bcd
)