我正在尝试编写一个正则表达式,它将字符串作为输入,还可以包含逗号和连字符,并验证 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);
}
在线试用!