我必须编写一个正则表达式来匹配模式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]$
此处,未识别单个数字。
答案 0 :(得分:1)
答案 1 :(得分:1)
答案 2 :(得分:1)
您可以使用正则表达式的以下更新:
^(?:0?[1-9]|1[0-2])\s*[-−—]\s*(?:0?[1-9]|1[0-2])\s*/\s*\s*2[01][0-9]{2}$
请参阅demo
它与12-30/2014
,12-31/2014
,12-32/2014
,13-31/2014
,20-6/2014
不匹配。
它将匹配1-6/2011
和02-12/2014
。
C#:
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);
请注意,只有在我们使用多线模式进行测试时才需要\r?
。您可以在检查单独的值时将其删除。
答案 3 :(得分:0)
与1-12匹配的最简单正则表达式为(1[0-2]?)|[2-9]
。
它与13
匹配1[0-2]?
与1
匹配,但在完整正则表达式(1[0-2]?)|[2-9]\/\d\d\d\d
中无关紧要。