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.TryParseContains 在分隔符上 .All(x =&gt; int.TryParse(x, out var v) &amp;&amp; v &gt;= 1 &amp;&amp; v &lt;= 150);:每一项都必须是有效整数TryParse 返回true)并且在[1..150] 范围内; Select中不需要 副作用:由于Parse/TryParse执行Trim(),以下字符串将被视为有效字符串:"123 - 56 ,\t4":请注意空格和制表符 请注意,如果您输入负值,则会中断(因为它会尝试解析减号左侧的空字符串)。

以上是关于1 到 150 之间的有效字符串的正则表达式,以逗号和连字符分隔的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式 - 将 HTML 转换为有效的 XML 标记 [重复]

150. 逆波兰表达式求值

验证有效时间的正则表达式

150. 逆波兰表达式求值

删除元素的正则表达式与特定前缀不匹配

【正则表达式】只允许输入5-10个字符要怎么写?