用于匹配多种日期格式的正则表达式

发布于 2024-08-31 23:27:30 字数 668 浏览 5 评论 0原文

匹配任何格式的日期的正则表达式应该是什么,例如:

26FEB2009
31DEC2009

27 Mar 2008
30 Jul 2009

26-Feb-2009
27-Aug-2009

29/05/2008

07.11.2008

Jan 11 2008
May 26 2008

该正则表达式应该是什么?

我的正则表达式与 26-Feb-200926 FEB 2009 匹配,但不与 26FEB2009 匹配。所以如果有人知道的话请更新一下。

(?:^|[^\d\w:])(?'day'\d{1,2})(?:-?st\s+|-?th\s+|-?rd\s+|-?nd\s+|-|\s+)(?'month'Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[uarychilestmbro]*(?:\s*,?\s*|-)(?:'?(?'year'\d{2})|(?'year'\d{4}))(?=$|[^\d\w])

日期 26FEB2009 是其他字符串的子字符串,例如 FUTIDX 26FEB2009 NIFTY 0 并从 html 页面解析,因此我无法设置空格或分隔符。

What should be the regex for matching date of any format like:

26FEB2009
31DEC2009

27 Mar 2008
30 Jul 2009

26-Feb-2009
27-Aug-2009

29/05/2008

07.11.2008

Jan 11 2008
May 26 2008

What should be the regular expression for that?

I have regex that matches with 26-Feb-2009 and 26 FEB 2009 with but not with 26FEB2009. So if any one know then please update it.

(?:^|[^\d\w:])(?'day'\d{1,2})(?:-?st\s+|-?th\s+|-?rd\s+|-?nd\s+|-|\s+)(?'month'Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[uarychilestmbro]*(?:\s*,?\s*|-)(?:'?(?'year'\d{2})|(?'year'\d{4}))(?=$|[^\d\w])

The date 26FEB2009 is substring of other string like FUTIDX 26FEB2009 NIFTY 0 and parsed from html page, so I can not set the whitespace or delimiter.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

游魂 2024-09-07 23:27:30

我建议您不要使用正则表达式来解析日期,甚至强烈反对使用正则表达式来解析 HTML。对于解析日期,您可以查看 TryParseExact 方法和使用 DOM 解析器解析 HTML,例如 Html Agility Pack

var dateStr = "26FEB2009";
var formats = new[] 
{ 
    "ddMMMyyyy", "dd MMM yyyy", "dd/MM/yyyy"
};
DateTime date;
if (DateTime.TryParseExact(
    dateStr, 
    formats, 
    CultureInfo.InvariantCulture, 
    DateTimeStyles.NoCurrentDateDefault, 
    out date))
{
    // You have a match, use the date object
}

I would advice you against using regex for parsing dates and even strongly against using regex for parsing HTML. For parsing dates you may take a look at the TryParseExact method and for parsing HTML a DOM parser such as Html Agility Pack:

var dateStr = "26FEB2009";
var formats = new[] 
{ 
    "ddMMMyyyy", "dd MMM yyyy", "dd/MM/yyyy"
};
DateTime date;
if (DateTime.TryParseExact(
    dateStr, 
    formats, 
    CultureInfo.InvariantCulture, 
    DateTimeStyles.NoCurrentDateDefault, 
    out date))
{
    // You have a match, use the date object
}
筱武穆 2024-09-07 23:27:30

如果它匹配 26 FEB 2009 而不是 26FEB2009,听起来您需要将每个日期段之间的空格和分隔符(“-”和“/”)设为可选。

+ 元字符指定一个或多个,请考虑使用 *(零个或多个)作为空格。

编辑

我的意思是,如果您的正则表达式将日期与空格/分隔符匹配,但不匹配没有其中任何一个的日期,即 26FEB2009,那么听起来您正在指定空格/分隔符对于匹配。

这是我快速拼凑起来的一些内容:

(\d{1,2})(\/|-|\s*)?((Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)|\d{2})(\/|-|\s*)?(\d{4})

您可能想检查它是否缺少您想要的某些功能,但它与您的所有示例相匹配。

If it's matching 26 FEB 2009 and not 26FEB2009, sounds like you need to make the whitespace and delimiter character("-" and "/") between each date segment optional.

The + meta character specifies one or more, consider using * (zero or more) for the whitespace.

EDIT

What I meant was, if your regular expression is matching dates with the whitespace/delimiter character, but is not matching the dates without either of them i.e 26FEB2009, then it sounds like you're specifying that the whitespace/delimiter be compulsory for a match.

Here's something I quickly knocked together:

(\d{1,2})(\/|-|\s*)?((Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)|\d{2})(\/|-|\s*)?(\d{4})

You might want to check that it's not missing certain features that you want, but it matches all of your examples.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文