【问题标题】:RegEx to match M/YYYY, MM/YYYY , M/YY or MM/YY format but not MM/DD/YYYY正则表达式匹配 M/YYYY、MM/YYYY、M/YY 或 MM/YY 格式,但不匹配 MM/DD/YYYY
【发布时间】:2015-12-15 06:05:35
【问题描述】:

好的,我已经为此奋斗了足够长的时间。我有一个正则表达式

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

这将匹配 8/15、08/15、8/2015、08/2015 所有我需要的。到目前为止,一切都很好。但我不需要它匹配 08/01/2015,但我在 08/01 得到部分匹配。如何忽略 08/01/2015?

【问题讨论】:

  • 如果您使用的是C#,既然可以使用DateTime 库,为什么还要使用正则表达式?您几乎可以肯定会在正则表达式中找到一个在特定情况下会失败的答案。闰年呢?还是少于 30 天的几个月?名单还在继续。
  • 也许negative look ahead assertion 会有所帮助。在模式的末尾尝试(?!/)
  • @Rob 我正在搜索数百个包含数万字和数十个日期的文档,试图找到日期。这是一个多遍过程,在第一遍中,我只是想找到不符合 xx/dd/yyyy 或 xx/dd/yy 模式的日期。

标签: c# regex date


【解决方案1】:

DateTime.ParseExact 是解决您的问题的一种更具可读性和可维护性的方法:https://msdn.microsoft.com/en-us/library/332de853(v=vs.110).aspx

如果我是你的同事,我会讨厌阅读这个丑陋的正则表达式,因为同样的概念可以用指定的库类如此优雅地表达。

其实更好的主意是TryParseExact:https://msdn.microsoft.com/en-us/library/h9b85w22(v=vs.110).aspx

如您所见,有一个接受多种格式的重载,这正是您的情况,您可以传递["M/yyyy", "MM/yyyy, "M/yy", "MM/yy"]

这是一个与您的案例非常相似的代码示例:https://stackoverflow.com/a/18247797/326370

【讨论】:

  • 嗯。好的。但是如何使用TryParseExact 解析像08/01/2015 is a sample date 这样的字符串?或正确的示例08/2015 is a sample date
  • 如果我试图验证一个或日期,这可能是一种方法。我正在搜索包含数万个单词和数十个日期的文档,试图找到日期。所以我怀疑使用在 99% 的情况下都不会成功的方法的有效性。如果我是你的同事,我会假设你足够聪明,可以提出问题,而不是试图说服你解决了错误的问题。
  • Touché :-) 人们有时会尝试解决错误的问题,但我错误地认为你是这样的。
【解决方案2】:

如果您的字符串以数字开头,您可以使用以下正则表达式。

^\d{1,2}\/(?:\d{2}|\d{4})(?!\/)

【讨论】:

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