C# 正则表达式的问题,我一直困扰着

C# 正则表达式的问题,我一直困扰着,c#,regex,lookbehind,negative-lookbehind,C#,Regex,Lookbehind,Negative Lookbehind,我必须编写一个正则表达式来匹配模式1-6/2011。 在这种情况下,/前面的数字不能大于12。 因此,我必须选择介于1-12之间的数字 我写了一个正则表达式: ^[1-9][0-2]?\s*[-−—]\s*[1-9][0-2]?\s*/\s*2[01][0-9][0-9]$ 然而,在这里,我得到了20-6/2014也作为一场比赛 我试着用消极的眼光看了看后面: ^[1-9](?<![2-9])[0-2]?\s*[-−—]\s*[1-9](?<![2-9])[0-2]?\s*/\s*

我必须编写一个正则表达式来匹配模式
1-6/2011
。 在这种情况下,
/
前面的数字不能大于
12
。 因此,我必须选择介于
1-12
之间的数字

我写了一个正则表达式:

^[1-9][0-2]?\s*[-−—]\s*[1-9][0-2]?\s*/\s*2[01][0-9][0-9]$
然而,在这里,我得到了20-6/2014也作为一场比赛

我试着用消极的眼光看了看后面:

^[1-9](?<![2-9])[0-2]?\s*[-−—]\s*[1-9](?<![2-9])[0-2]?\s*/\s*2[01][0-9][0-9]$
^[1-9](?
在这里,无法识别单个数字

所以我必须选择1-12之间的数字

为此,您可以使用正则表达式

(?:0?[1-9]|1[0-2])
见演示


与1-12匹配的最简单正则表达式是
(1[0-2]?)|[2-9]


它与
13
匹配,因为
1[0-2]?
1
匹配,但在完整的正则表达式
(1[0-2]?)|[2-9]\/\d\d\d
中,它并不重要

^(?:[1-9]|1[0-2])\s*-\s*(?:[1-9]|1[0-2])\s*/\s*2[01]\d{2}$

您可以使用以下正则表达式更新:

^(?:0?[1-9]|1[0-2])\s*[-−—]\s*(?:0?[1-9]|1[0-2])\s*/\s*\s*2[01][0-9]{2}$

它将不匹配
12-30/2014
12-31/2014
12-32/2014
13-31/2014
20-6/2014

它将与2011年6月1日<代码>和2014年12月2日<代码>相匹配

C#:


请注意,
\r?
仅在启用多行模式的情况下才是必需的。您可以在检查单独的值时删除它。

使用
更多。您可以像这样匹配所有数字1-12:
([1-9]| 1[0-2])
我只需要1-12两种情况。编写了这个^(?:0?[1-9]| 1[0-2])\s*[-−—]\s*(?:0?[1-9]| 1[0-2])\s*/\s*\s*2[01][0-9][0-9]它解决了你的问题吗?或者你需要更多的帮助吗?哦,DIN看到UR最后的评论,我的问题得到解决。我尝试了ExpSO并在Debug下检查,如果它对你有用的话,请考虑接受这个答案。这个正则表达式似乎有问题,当我为COMPL编写完整的正则表达式时,它给了我超时。ete match ie.1-6/2011我超时了。请查看您的网站链接。当我添加了更多类型的连字符时,它超时了,因为正则表达式的执行时间超过了2秒。我尝试了expresso,很好。很难想象这个正则表达式的执行时间是2秒,因为这是非常基本和简单的正则表达式。如果您提供一些复制这种缓慢的示例,然后我可以看一看。感谢anubhava,我尝试了expresso工具和debuggex。它工作得很好。
var lines = "1-6/2011\r\n02-12/2014\r\n12-30/2014\r\n12-31/2014\r\n12-32/2014\r\n13-31/2014\r\n20-6/2014";
var finds = Regex.Matches(lines, @"^(?:0?[1-9]|1[0-2])\s*[-−—]\s*(?:0?[1-9]|1[0-2])\s*/\s*\s*2[01][0-9]{2}\r?$", RegexOptions.Multiline);