我必须写一个匹配模式1-6/2011
的正则表达式。在这种情况下,/
前面的数字不能大于12
。所以我必须在1-12
之间选择数字。
^[1-9][0-2]?s*[-−—]s*[1-9][0-2]?s*/s*2[01][0-9][0-9]$
然而,在这里我得到206/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-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
。
它将匹配1-6/2011
和02-12/2014
。
var lines = "1-6/2011rn02-12/2014rn12-30/2014rn12-31/2014rn12-32/2014rn13-31/2014rn20-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?
仅在我们使用多行模式进行测试时才需要。您可以在检查单独的值时删除它。
所以我必须选择1-12之间的数字
可以使用regex
(?:0?[1-9]|1[0-2])
看演示。https://www.regex101.com/r/fJ6cR4/23
你可以使用这个正则表达式:
^(?:[1-9]|1[0-2])s*-s*(?:[1-9]|1[0-2])s*/s*2[01]d{2}$
RegEx演示
与1-12匹配的最简单的正则表达式是(1[0-2]?)|[2-9]
。
它与13
匹配,因为1[0-2]?
与1
匹配,但在完整的regex (1[0-2]?)|[2-9]/dddd
中不重要。