正则表达式表示 1 到 150 之间的有效字符串,用逗号和连字符分隔



我正在尝试编写一个正则表达式,它将字符串作为输入,还可以包含逗号和连字符,并验证 1 - 150 范围内的有效数字,到达下面的正则表达式,但如果我将字符串作为 1-151 给出,它会失败,因为它认为 51 中的 151 是有效的。

1,10,1-150,25 valid
0,1-10 invalid(as 0 is present)
1,2,3-151,5 invalid (as 151 is present)
10,0-4,5 invalid (as 0 is present)

我写的正则表达式

([1-9][,-])|([1-8][0-9][,-])|9[0-9][,-]|1[0-4][0-9][,-]|150[,-]

这个正则表达式将做你想要的:

^(([1-9]|[1-9][0-9]|1[0-4][0-9]|150)([,-](?=d)|$))+$

它查找一组有效数字(1-9、10-99、100-149、150(,并检查每个数字后面是否跟着,-或行尾($(。如果数字后跟逗号或连字符,它会检查下一个字符是否为数字,以便它不匹配(例如(1,34-

正则表达式 101 演示

正如@some1所说,使用带有一点Linq的Split更容易阅读(以及以后的更改,改进等(。至少,这是这个替代方案:

private static bool IsValid(string s)
{
return s.Split(new []{',','-'}).Select(int.Parse).All(x => x > 0 && x < 151);
}

在线试用!

遵循@Rawling和@Dmitry比琴科的主张

private static bool IsValid(string s)
{
return s.Split(new []{',','-'}).All(x => int.TryParse(x, out var v) && v >= 1 && v <= 150);
}

在线试用!