如何编写正则表达式以匹配数字范围?

时间:2011-03-07 21:20:31

标签: regex

我正在使用asp.net RegularExpressionValidator来检查多行文本框上的输入。我几乎拥有它,但我必须遗漏一些东西。这就是它应该是:

1 => valid

1-10 => valid

1-10,45,50 => valid

1 10 45 50 => valid

111 => INVALID

但是,111将返回有效

以下是我正在使用的正则表达式:"(([0-9]{1,2})(,|\s|-)?)*"它适用于除111之外的所有内容,它表示有效。我知道它为什么认为它有效,我只是不知道如何使它无效。

7 个答案:

答案 0 :(得分:3)

不要让分隔符可选,那么你将匹配number-nothing-number,因此匹配111,而是做类似的事情:

"[0-9]{1,2}([-,\s][0-9]{1,2})*"
为清晰起见,

编辑:如果您的正则表达式引擎与整个字符串不匹配,则需要在开头添加^,并在结束时添加$正则表达式。

答案 1 :(得分:0)

您写的正则表达式匹配“111”中的“11”和重复模式的零次匹配。如果你将正则表达式包装在^ ... $中它应该可以工作:

^(([0-9]{1,2})(,[\s-])?)*$

从那时起,正则表达式将不允许字符串中的任何其他字符。

答案 2 :(得分:0)

[0-9]{1,2}学期之后,您需要一个负向前瞻以确保下一个字符也不是数字。我不熟悉asp.net,但像[0-9]{1,2}(?![0-9])这样的东西可能会产生更好的结果。有关前瞻的更多信息,请参阅this page

修改:上面发布的正则表达式有帮助,但仍匹配111的后两位数字。以下正则表达式应该有效(使用online regex tester验证)。它在开头添加了一个单词边界锚点,这可以防止表达式在数字中间开始匹配。它还使分隔符成为必需而非可选。这种组合消除了对前瞻的需求。

(\b([0-9]{1,2})(-|,|\s|$))+

答案 3 :(得分:0)

使用^左键锚定您的模式。 *贪婪,您在1中的第二个和第三个111上匹配。

答案 4 :(得分:0)

也许是为了让事情变得更简单,将其分解为多个正则表达式检查?

如果字符串与(([0-9]{1,2})(,|\s|-)?)*匹配,则检查字符串是否与\d{3,}匹配。如果是,那么失败否则通过。

答案 5 :(得分:0)

我认为你需要要求分隔符。 '?'允许零个或一个实例。

答案 6 :(得分:0)

我认为有两个问题。一个问题是正则表达式验证用户输入的每个字符。之后提取数据的另一个正则表达式。

要使用对每个输入字符进行验证的正则表达式,结束锚点比开头更重要,尽管起始锚点,不需要的字符可以进入。

所以在rubular.com上,这个特殊的正则表达式允许使用规则的[, - ]字符

  1. 连续不超过2位数
  2. commma或space或dash,连续不超过2个
  3. 最后,数据提取会有所不同,所以这只适用于每个字符输入的用户。

    对于我尝试的各种变体,它都有效。

    ^(?:\b\d{1,2}(?:([, -])(?!\1)[, -]?|))+$

    确实需要\b来区分连续3位数 尝试一下。