我坚持的正则表达式问题
Regex issue i am stuck with
我必须编写一个正则表达式来匹配模式 1-6/2011
。
在这种情况下,/
之前的数字不能大于 12
。
所以我必须在 1-12
之间 select 数字。
我写了一个正则表达式:
^[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]$
在这里,没有识别单个数字。
So i have to select digits between 1-12
为此你可以使用正则表达式
(?:0?[1-9]|1[0-2])
查看演示。
与 1-12 匹配的最简单的正则表达式是 (1[0-2]?)|[2-9]
。
它与 13
匹配,因为 1[0-2]?
与 1
匹配,但在完整的正则表达式 (1[0-2]?)|[2-9]\/\d\d\d\d
.
中并不重要
您可以使用这个正则表达式:
^(?:[1-9]|1[0-2])\s*-\s*(?:[1-9]|1[0-2])\s*/\s*2[01]\d{2}$
您可以使用以下正则表达式更新:
^(?: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?
仅在我们使用多行模式进行测试时才需要。您可以在检查单独的值时将其删除。
我必须编写一个正则表达式来匹配模式 1-6/2011
。
在这种情况下,/
之前的数字不能大于 12
。
所以我必须在 1-12
之间 select 数字。
我写了一个正则表达式:
^[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]$
在这里,没有识别单个数字。
So i have to select digits between 1-12
为此你可以使用正则表达式
(?:0?[1-9]|1[0-2])
查看演示。
与 1-12 匹配的最简单的正则表达式是 (1[0-2]?)|[2-9]
。
它与 13
匹配,因为 1[0-2]?
与 1
匹配,但在完整的正则表达式 (1[0-2]?)|[2-9]\/\d\d\d\d
.
您可以使用这个正则表达式:
^(?:[1-9]|1[0-2])\s*-\s*(?:[1-9]|1[0-2])\s*/\s*2[01]\d{2}$
您可以使用以下正则表达式更新:
^(?: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?
仅在我们使用多行模式进行测试时才需要。您可以在检查单独的值时将其删除。