1 到 150 之间的有效字符串的正则表达式,以逗号和连字符分隔
Posted
技术标签:
【中文标题】1 到 150 之间的有效字符串的正则表达式,以逗号和连字符分隔【英文标题】:Regex for valid string between 1 and 150 separated by comma and hyphen 【发布时间】:2019-03-01 20:52:17 【问题描述】:我正在尝试编写一个正则表达式,它以字符串作为输入,还可以包含逗号和连字符并验证 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[,-]
【问题讨论】:
而不是复杂的正则表达式,您可以使用分隔符拆分字符串,然后在循环中检查每个元素吗?有时这在编码和性能方面会更有效。 @some1 - 计划做同样的事情,如果我在一段时间内找不到任何简单的解决方案,只是想问问这里的人。123-12-34-56
是 有效 字符串吗(没有逗号,只有连字符)?
你的字符串中能遇到负数吗?
@aloisdg - 不,不应允许负数,等于或小于 0 的任何值都是无效的。
【参考方案1】:
这个正则表达式会做你想做的事:
^(([1-9]|[1-9][0-9]|1[0-4][0-9]|150)([,-](?=\d)|$))+$
它会查找一组有效数字(1-9、10-99、100-149、150)并检查每个数字后跟,
、-
或行尾(@987654325 @)。如果数字后跟逗号或连字符,它会检查下一个字符是否为数字,因此它不匹配(例如)1,
或 34-
。
Regex101 demo
【讨论】:
适用于所有组合,但 100 到 109 之间的数字除外 @G--抱歉,我显然在你复制后修复了这个问题...请再试一次... @Rawling 你是对的,它们是我写的第一个正则表达式版本的遗留物。 @G-- 感谢您的接受,我已经做了一点修改(一个虚假的?
已被删除),请确保您使用该版本。演示链接也已更新。很抱歉跑来跑去!【参考方案2】:
正如@some1 所说,将Split
与一些Linq 一起使用更容易阅读(以及以后更改、改进等)。至少,这是一个替代方案:
private static bool IsValid(string s)
return s.Split(new []',','-').Select(int.Parse).All(x => x > 0 && x < 151);
Try it Online!
遵循@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);
Try it Online!
【讨论】:
int.Parse
如果字符串无效会抛出异常。
@Rawling right OP 可能想要检查输入是否可能存在无效字符串。 int.TryParse
和 Contains
在分隔符上
.All(x => int.TryParse(x, out var v) && v >= 1 && v <= 150);
:每一项都必须是有效整数(TryParse
返回true
)并且在[1..150]
范围内; Select
中不需要
副作用:由于Parse
/TryParse
执行Trim()
,以下字符串将被视为有效字符串:"123 - 56 ,\t4"
:请注意空格和制表符
请注意,如果您输入负值,则会中断(因为它会尝试解析减号左侧的空字符串)。以上是关于1 到 150 之间的有效字符串的正则表达式,以逗号和连字符分隔的主要内容,如果未能解决你的问题,请参考以下文章