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

Javascript 1到150之间的有效字符串的正则表达式,由逗号和连字符分隔,javascript,c#,regex,Javascript,C#,Regex,我正在尝试编写一个正则表达式,它以字符串作为输入,还可以包含逗号和连字符,并验证1-150范围内的有效数字,到达下面的正则表达式,但如果我将字符串设为1-151,它将失败,因为它认为151中的51是有效的 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-150范围内的有效数字,到达下面的正则表达式,但如果我将字符串设为1-151,它将失败,因为它认为151中的51是有效的

 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-不匹配

正如@some1所说的,使用带有一点Linq的Split更容易阅读,以后也更容易修改、改进等等。。至少,这是一个备选方案:

private static bool IsValid(string s)
{
    return s.Split(new []{',','-'}).Select(int.Parse).All(x => x > 0 && x < 151);
}
遵循@Rawling和@Dmitry Bychenko命题

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

不使用复杂的正则表达式,您是否可以使用除数器拆分字符串,然后检查循环中的每个元素?有时,这在编码和性能方面更有效。@some1-计划做同样的事情,如果我在某段时间内找不到任何简单的解决方案,我只想问问这里的人。123-12-34-56是有效字符串吗?只有逗号和连字符?你能面对字符串中的负数吗?@ALOISG-不,负数不应该被允许,任何等于或小于0的值都无效。适用于除100到100之间的数字以外的所有组合109@G-很抱歉,我很明显在你复制它之后修复了它。。。请再试一次…@Rawling你是对的,它们是我写的正则表达式的第一个版本的遗留物。@G-谢谢你接受,我做了一个小小的修改,因为一个假的?已删除,请确保使用该版本。演示链接也已更新。对不起,我跑来跑去了!int.Parse将在字符串无效时引发异常。@如果可能存在无效字符串,Rawling right OP可能需要检查输入。int.TryParse和Contains on分隔符。Allx=>int.TryParsex,out var v&&v>=1&&v副作用:由于Parse/TryParse执行修剪,以下字符串将被视为有效字符串:123-56,\t4:please,请注意空格和制表符注意,如果输入负值,则会中断,因为它试图解析负号左侧的空字符串。