正则表达式问题,我坚持



我必须写一个匹配模式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/201102-12/2014

c#:

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中不重要。

最新更新