整数范围和倍数

时间:2015-01-27 13:01:28

标签: regex

我想要在文本输入上验证多个字段,其中一个正则表达式用于匹配范围(0..120),并且必须是5的倍数。

例如,0,5,25,120有效。 1,16,123,130无效。

我认为我有5的倍数的正则表达式:

^\d*\d?((5)|(0))\.?((0)|(00))?$

和范围的正则表达式:

120|1[01][0-9]|[2-9][0-9]

但是,我不知道如何结合这些,任何帮助非常感谢!

3 个答案:

答案 0 :(得分:2)

你不能用一个简单的正则表达式来做到这一点。至少不是范围部分(特别是如果范围应该是通用/可变的)。

即使你设法编写正则表达式,它也会非常复杂且难以理解。

使用您的语言的parseStringToInt()函数以及简单的<>检查,自行编写验证。

答案 1 :(得分:1)

冒着痛苦明显的风险

120|1[01][05]|[2-9][05]

另外,为什么2?

答案 2 :(得分:1)

更新添加了另一个regex(见下文),以便在值范围不是0时使用120(甚至可以动态)。


问题中的第二个regex与小于20的数字不匹配。您可以更改它以匹配始终以05结尾的较小数字5 1}}:

\b(120|(1[01]|[0-9])?[05])\b

工作原理(从内部开始):

  • (1[01]|[0-9])?匹配1011或任意一位数字(09);这些是最后数字中的数百和数十;子表达式后的问号(?)使其匹配0或1次;这样正则表达式也可以匹配只有一位数的数字(0 .. 9);
  • 后面的
  • [05]在最后一位数字(单位)上匹配05;只有以05结尾的数字才是5的倍数;
  • 所有内容都括在括号中,因为|的优先级高于\b;
  • 外部\b匹配字边界;它们阻止正则表达式匹配只有1到3个数字来自更长的数字或嵌入字符串的数字;它会阻止它与15中的150120中的abc120匹配。

使用动态值范围

上面的regex不是很复杂,可以用来匹配0120之间5倍数的数字。当值的范围不同时,不能再使用它。可以修改它以匹配20120之间的数字(正如OP在下面的评论中提到的那样),但它将变得更难阅读。

此外,如果允许值的范围是动态的,那么根本不能使用regex来匹配范围内的值。然而,使用5可以实现与regex的多重性: - )

对于5倍数的动态范围值,您可以使用以下表达式:

\b([1-9][0-9]*)?[05]\b

将匹配的字符串解析为整数(您使用的语言可能提供此类函数或包含它的库)然后使用宿主语言的比较运算符(<>)来检查如果匹配的值在所需范围内。