我必须编写匹配模式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]$
在这里,个位数没有被识别出来。
发布于 2015-05-20 10:15:44
您可以使用以下regex更新:
^(?: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
相匹配。
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?
才是必要的。您可以在检查单独的值时删除它。
发布于 2015-05-20 10:08:19
发布于 2015-05-20 10:10:00
https://stackoverflow.com/questions/30346482
复制相似问题