正则表达式匹配 M/YYYY、MM/YYYY、M/YY 或 MM/YY 格式,但不匹配 MM/DD/YYYY。

3

好的,我已经和这个问题抗争了很久了。 我有一个正则表达式

^(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?


7
如果你正在使用 C#,为什么要使用正则表达式呢?你几乎肯定会发现在某些特殊情况下,使用正则表达式得到的答案是错误的。考虑闰年和月份少于30天的情况呢?问题还有很多其他方面需要考虑。相比之下,使用 DateTime 库更为可靠。 - Rob
2
也许使用“负向先行断言”可以帮助解决问题。在您的模式末尾尝试使用(?!/). - Sebastian Schumann
@Rob 我正在搜索数百个文件,其中包含成千上万个单词和数十个日期,试图找到这些日期。这是一个多遍过程,在第一遍中,我只是试图找到不符合xx/dd/yyyy或xx/dd/yy模式的日期。 - WouldRatherBuildAMotor
2个回答

5
DateTime.ParseExact是一种更易读和可维护的方法来解决您的问题:https://msdn.microsoft.com/en-us/library/332de853(v=vs.110).aspx 如果我是你的同事,当可以使用指定库类表达相同概念时,我会讨厌阅读这个丑陋的正则表达式。
实际上,一个更好的想法是TryParseExacthttps://msdn.microsoft.com/en-us/library/h9b85w22(v=vs.110).aspx 正如您所看到的,有一个重载接受多个格式,这正是您的情况,并且您可以传递["M/yyyy", "MM/yyyy, "M/yy", "MM/yy"]
这里有一个非常类似于您情况的代码示例:https://dev59.com/BnXYa4cB1Zd3GeqP9LX_#18247797

哦,不错。但是如何使用TryParseExact解析像08/01/2015是一个示例日期这样的字符串呢?或者像08/2015是一个示例日期这样的正确示例。 - Sebastian Schumann
1
如果我要验证一个或多个日期,这可能是一种方法。我正在搜索数万字和数十个日期的文档,试图找到这些日期。因此,我怀疑使用一种在99%的情况下无法找到匹配项的方法的有效性。如果我是你的同事,我会认为你足够聪明去问问题,而不是试图说服你解决错误的问题。 - WouldRatherBuildAMotor
人们有时会试图解决错误的问题,但我错了,认为你也是这样。 - Ilya Kogan

1
如果您的字符串以数字开头,可以使用以下正则表达式。
^\d{1,2}\/(?:\d{2}|\d{4})(?!\/)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接