如何制定正则表达式以从特定字符串中获取日期?

发布于 2024-10-06 14:42:04 字数 508 浏览 3 评论 0原文

我有以下字符串:

月份:
1月11日
2月11日
3月11日
4月11日
等等
宿舍:
11 季度
11 年第二季度
11 年第三季度
11 年第四季度
第一季度 12
等等

Cal_11
Cal_12
Cal_13
等等

我想使用正则表达式来创建一个 DateTime 对象,该对象从字符串表示的每个日期的开头开始 所以 Jan11 为

new DateTime(2011,1,1)

,Q2 11 为

new DateTime(2011,4,1)

,Cal_12 为

new DateTime(2012,1,1).

i have the following strings:

Months:
Jan11
Feb11
Mar11
Apr11
etc.
Quarters:
Q1 11
Q2 11
Q3 11
Q4 11
Q1 12
etc.
Years
Cal_11
Cal_12
Cal_13
etc.

I would like to use a regular expression to create a DateTime object starting at the beginning of each date represented by a string. So Jan11 would be

new DateTime(2011,1,1)

, Q2 11 would be

new DateTime(2011,4,1)

and Cal_12 would be

new DateTime(2012,1,1).

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

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

发布评论

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

评论(1

橘虞初梦 2024-10-13 14:42:04

这应该考虑所有三种情况:

DateTime? parse(string text)
{
    Match m = Regex.Match(text, @"^(\w\w\w)(\d+)$");
    if (m.Success)
    {
        return new DateTime(
            2000 + Convert.ToInt32(m.Groups[2].Value), 
            1 + Array.IndexOf(CultureInfo.CurrentCulture.DateTimeFormat.AbbreviatedMonthNames, m.Groups[1].Value), 
            1);
    }

    m = Regex.Match(text, @"^Q(\d+) (\d+)$");
    if (m.Success)
    {
        return new DateTime(
            2000 + Convert.ToInt32(m.Groups[2].Value), 
            1 + 3 * (Convert.ToInt32(m.Groups[1].Value) - 1), 
            1);
    }

    m = Regex.Match(text, @"^Cal_(\d+)$");
    if (m.Success)
    {
        return new DateTime(
            2000 + Convert.ToInt32(m.Groups[1].Value),
            1,
            1);
    }

    return null;
}

像这样调用:

parse("Jan11");
parse("Q2 11");
parse("Cal_12");

请注意,这不会考虑传入的错误数据。这可以明显地添加,但会使示例变得非常混乱。

This should take of all three cases:

DateTime? parse(string text)
{
    Match m = Regex.Match(text, @"^(\w\w\w)(\d+)$");
    if (m.Success)
    {
        return new DateTime(
            2000 + Convert.ToInt32(m.Groups[2].Value), 
            1 + Array.IndexOf(CultureInfo.CurrentCulture.DateTimeFormat.AbbreviatedMonthNames, m.Groups[1].Value), 
            1);
    }

    m = Regex.Match(text, @"^Q(\d+) (\d+)$");
    if (m.Success)
    {
        return new DateTime(
            2000 + Convert.ToInt32(m.Groups[2].Value), 
            1 + 3 * (Convert.ToInt32(m.Groups[1].Value) - 1), 
            1);
    }

    m = Regex.Match(text, @"^Cal_(\d+)$");
    if (m.Success)
    {
        return new DateTime(
            2000 + Convert.ToInt32(m.Groups[1].Value),
            1,
            1);
    }

    return null;
}

Calling like this:

parse("Jan11");
parse("Q2 11");
parse("Cal_12");

Please note that this doesn't account for incorrect data passed in. This could be added obviously, but would make the example quite cluttered.

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