【问题标题】:RegEx to match M/YYYY, MM/YYYY , M/YY or MM/YY format正则表达式匹配 M/YYYY、MM/YYYY、M/YY 或 MM/YY 格式
【发布时间】:2010-10-15 17:04:15
【问题描述】:

需要帮助查找或使 RegEx 匹配 MM/YY 或 MM/YYYY 格式。我的 RegExFu 很弱,我什至不知道从哪里开始写这篇文章。

月应该是 1-12,年,2009 年以后的任何东西都应该是有效的。很抱歉之前没有提及更多细节。这用作到期日期。

我将为超越并验证 >= 今天日期的 MM/YY 或 MM/YYYY 格式的任何人添加赏金。让过期的东西通过第一个验证层是没有意义的。


我感觉很糟糕,因为我改变了我的要求,并且必须更具体地说明我在中间问题中需要什么,所以一旦无赏金窗口期满,我将奖励所有回答的人。

【问题讨论】:

  • 您会喜欢regular-expressions.info 的教程和weitz.de/regex-coach 的试用版。 (\d\d)/(\d\d) 是 mm/yy 的开始。抱歉,我现在懒得做其他人了。
  • 如果你打算让用户输入2 digit years,我不建议这样做。总是喜欢4 digits(全数字)。
  • @BrunoLM,好吧,我正在使用的 API 接受 MM/YY 格式,所以我可以为我的用户提供任何一点好处。
  • 所以你想要year >= 2010 有效吗?
  • 你将如何使用它?你将在哪里验证?您是否考虑过日期最少的日历控件?

标签: c# regex


【解决方案1】:

怎么样

^(1[0-2]|0[1-9]|\d)\/(20\d{2}|19\d{2}|0(?!0)\d|[1-9]\d)$

匹配月份

// 10 to 12 | 01 to 09 | 1 to 9
(1[0-2]|0[1-9]|\d)

岁月

// 2000 to 2099 | 1900 to 1999
// 01 to 09 | 10 to 99
(20\d{2}|19\d{2}|0(?!0)\d|[1-9]\d)

匹配任何东西>= 2010

/^(1[0-2]|0[1-9]|\d)\/([2-9]\d[1-9]\d|[1-9]\d)$/;

结果:

12/2009 : false
1/2010  : true
12/2011 : true
12/9011 : true
12/07   : false
12/17   : true

【讨论】:

  • @Bruno,这基本上就是我的答案。
  • 排除00 的年份有什么原因吗?使用它可能不是一个好习惯,因为它有点令人困惑,但它似乎仍然完全有效。还是 C# 不允许日期格式?
  • @eldarerathis:OP 没有说他期望的范围。我决定排除00,因为它对我来说似乎模棱两可。 001900 还是 2000?无论如何,这只是一个例子。我建议始终使用4 digits
  • @jfar: 1/81 不是 MM/YYYY 或 MM/YY 格式。 01/81 会是,但如果您还想要 M/YYYY 和 M/YY,则应该编辑您的问题。
  • @jfar:谢谢 :)。我已经更新了anything beyond 2009。我假设x >= 2010 是有效的。并假设 2 位数字是 20xx
【解决方案2】:

试试:

var re = new Regex(@"(?<month>\d{2})/(?<year>\d{2}|\d{4})");
var month = re.Match(yourString).Groups["month"];
...

另一种选择是:

if(dateStr.Length == 5)
    myDateTime = DateTime.ParseExact("MM/YY", dateStr);
else
    myDateTime = DateTime.ParseExact("MM/YYYY", dateStr);

【讨论】:

  • 感谢您指出 ParseExact。这让我的验证更加出色。
  • ParseExact 可以采用一系列格式,这明显优于正则表达式。
【解决方案3】:

试试这个:

^(0?[1-9]|1[0-2])/(19|2[0-1])?\d{2}$

限制为一位和两位数的月份(01-12、1-12)和两年和四年(00-99、1900-2199)。

【讨论】:

  • 这也匹配“MM/YYY”。
  • @Brad,这与 11/81 不匹配
  • 上半年不接受有效的两位数月份。预计 4 位数字:rubular.com/r/5yiqpDFKyy
【解决方案4】:

@BrunoLM,

^(1[0-2]|0[1-9]|\d)\/(20\d{2}|19\d{2}|0(?!0)\d|[1-9]\d)$

匹配“0/2009”。我可以提出一个小的改进:

^(1[0-2]|0[1-9]|[1-9])\/(20\d{2}|19\d{2}|0(?!0)\d|[1-9]\d)$

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 2017-07-10
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    相关资源
    最近更新 更多