我的正则表达式只捕获一个日期

时间:2015-05-04 07:33:46

标签: .net regex vb.net

这是我用于以dd-MMM-yyyy格式捕获日期的正则表达式

(\b\d{1,2}-(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)-(19|20)\d{2}\b)

我已尝试对整个正则表达式进行分组,但它仅捕获第一次出现的正则表达式。

例如,在字符串" BETWEEN 04-May-2015和2015年5月5日"它只捕获2015年5月4日。

这是vb.net代码:

Dim rx as regex = new regex("\b\d{1,2}-(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)-(19|20)\d{2}\b",(RegexOptions.Compiled Or RegexOptions.IgnoreCase))
Dim m as match = rx.match(criteria)
if m.success then
    Console.Writeline(m.Groups(0).Captures.Count)
end if

我哪里错了?任何帮助都会很棒。

2 个答案:

答案 0 :(得分:3)

如果您希望多次匹配,则必须使用Regex.Matches代替Regex.Match

给定输入字符串和模式,此代码

Dim s = "BETWEEN 04-May-2015 AND 05-May-2015"
Dim results = Regex.Matches(s, "\b\d{1,2}-(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)-(19|20)\d{2}\b", RegexOptions.IgnoreCase)
Console.WriteLine(results.Count())

打印2,因此您的模式本身可以正常工作。

您可以将其更改为:

\b(\d{1,2})-(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)-((?:19|20)\d{2})\b

捕捉日,月和年(如果这是你想要的)。

答案 1 :(得分:2)

这不是你的正则表达式的问题,这是因为周围的代码处理正则表达式。您没有显示它,但需要使用Regex.Matches方法,该方法返回包含所有匹配项的MatchCollection