1

我必须编写一个正则表达式来匹配模式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]$

在这里,单个数字没有被识别。

4

4 回答 4

1

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

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

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

见演示。

https://www.regex101.com/r/fJ6cR4/23

于 2015-05-20T10:08:19.563 回答
1

您可以使用此正则表达式:

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

正则表达式演示

于 2015-05-20T10:10:00.947 回答
1

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

^(?: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/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-20T10:15:44.380 回答
0

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

它与13cause1[0-2]?匹配1,但在完整的正则表达式中无关紧要(1[0-2]?)|[2-9]\/\d\d\d\d

于 2015-05-20T10:09:37.950 回答