【发布时间】:2017-01-13 10:08:28
【问题描述】:
我有以下问题:
- 将通过正则表达式验证字符串。
- 字符串包含用分号分隔的范围或单个值,例如
100-200;10;2300-3400;34; - 每个数字的最大值为
99999。 - 字符串中不允许有字母。
我现在所拥有的:
^([0-9]{1,5}[-][0-9]{1,5}[;])? ^([0-9]{1,5}[;])? ([0-9]{1,5}[-][0-9]{1,5}[;])?([0-9]{1,5}[;])? ([0-9]{1,5}[-][0-9]{1,5}[;])*$? ([0-9]{1,5}[;])*$?
因此我的正则表达式包含三个可选的组类型:
- 开始:
^([0-9]{1,5}[-][0-9]{1,5}[;])? ^([0-9]{1,5}[;])? - 中:
([0-9]{1,5}[-][0-9]{1,5}[;])?([0-9]{1,5}[;])? - 结束:
([0-9]{1,5}[-][0-9]{1,5}[;])*$? ([0-9]{1,5}[;])*$?
这个正则表达式并不能解决我的问题,例如输入表达式中的字母通常返回 true,但应该返回 false。关于如何解决这个问题的任何想法?
这是 RB 评论后的正则表达式的简化版本:
- 开始:
^(\d{1,5}\-\d{1,5};)? ^(\d{1,5};)? - 中:
(\d{1,5}\-\d{1,5};)? (\d{1,5};)? - 结束:
(\d{1,5}\-\d{1,5};)*$? (\d{1,5};)*$?
【问题讨论】:
-
负
-10-10范围和降范围200-100怎么样? -
不允许负数范围,降序数是
-
为什么不先用分号再用破折号分割字符串。最后使用 int.TryParse.
-
@jdweng 虽然我在这里同意这种方法,但似乎 OP 只是在进行验证,所以这可能有点矫枉过正,但是如果他们正在使用结果,那么我会这样做
-
您可以使用
\A(?<val>[0-9]{1,5}(?:-[0-9]{1,5})?)(?:;(?<val>[0-9]{1,5}(?:-[0-9]{1,5})?))*;\z。val组捕获将保存这些值。好吧,正则表达式模式可以动态构建以使其更具可读性。