我想要在文本输入上验证多个字段,其中一个正则表达式用于匹配范围(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]
但是,我不知道如何结合这些,任何帮助非常感谢!
答案 0 :(得分:2)
你不能用一个简单的正则表达式来做到这一点。至少不是范围部分(特别是如果范围应该是通用/可变的)。
即使你设法编写正则表达式,它也会非常复杂且难以理解。
使用您的语言的parseStringToInt()
函数以及简单的<
和>
检查,自行编写验证。
答案 1 :(得分:1)
冒着痛苦明显的风险
120|1[01][05]|[2-9][05]
另外,为什么2?
答案 2 :(得分:1)
更新添加了另一个regex
(见下文),以便在值范围不是0
时使用120
(甚至可以动态)。
问题中的第二个regex
与小于20的数字不匹配。您可以更改它以匹配始终以0
或5
结尾的较小数字5
1}}:
\b(120|(1[01]|[0-9])?[05])\b
(1[01]|[0-9])?
匹配10
,11
或任意一位数字(0
至9
);这些是最后数字中的数百和数十;子表达式后的问号(?
)使其匹配0或1次;这样正则表达式也可以匹配只有一位数的数字(0
.. 9
); [05]
在最后一位数字(单位)上匹配0
或5
;只有以0
或5
结尾的数字才是5
的倍数; |
的优先级高于\b
; \b
匹配字边界;它们阻止正则表达式匹配只有1到3个数字来自更长的数字或嵌入字符串的数字;它会阻止它与15
中的150
或120
中的abc120
匹配。上面的regex
不是很复杂,可以用来匹配0
和120
之间5
倍数的数字。当值的范围不同时,不能再使用它。可以修改它以匹配20
和120
之间的数字(正如OP在下面的评论中提到的那样),但它将变得更难阅读。
此外,如果允许值的范围是动态的,那么根本不能使用regex
来匹配范围内的值。然而,使用5
可以实现与regex
的多重性: - )
对于5
倍数的动态范围值,您可以使用以下表达式:
\b([1-9][0-9]*)?[05]\b
将匹配的字符串解析为整数(您使用的语言可能提供此类函数或包含它的库)然后使用宿主语言的比较运算符(<
,>
)来检查如果匹配的值在所需范围内。