正则表达式限制文本框输入:最多10位整数,最多2位小数
解决方案:修正后的正则表达式
没问题,我来帮你搞定这个正则的漏洞,直接上完全符合要求的写法:
^(\d{1,9}(\.\d{1,2})?|\d{10})$
规则拆解说明
这个正则通过分支匹配的思路,精准堵上了“10位整数后加小数点”的漏洞:
^和$锚定整个输入字符串,确保不会出现部分匹配的情况(比如输入里混了其他字符却没被检测到)- 第一个分支
\d{1,9}(\.\d{1,2})?:- 负责匹配1-9位整数,后面可以选择性添加小数点+1-2位小数,满足“整数不足10位时可加小数”的需求
- 第二个分支
\d{10}:- 仅匹配恰好10位整数,没有任何小数点的可选分支,从根源上禁止了10位整数后加小数点的操作
验证示例
有效输入(会被匹配)
999999999.22→ 匹配第一个分支(9位整数+2位小数)1234567890→ 匹配第二个分支(10位整数)123447899.1→ 匹配第一个分支(9位整数+1位小数)
无效输入(不会被匹配)
99999999999→ 11位整数,超出最大长度限制9999999999.12→ 10位整数后加小数点,不符合分支规则
为什么之前的正则会踩坑?
大概率你之前用的是类似 ^\d{1,10}(\.\d{1,2})?$ 的写法——这个正则允许10位整数后面跟小数点,因为\d{1,10}包含了10位的情况,而后面的(\.\d{1,2})?又允许添加小数部分。我们的修正版把10位整数单独作为一个分支,不允许后续的小数点,就彻底解决了这个漏洞。
内容的提问来源于stack exchange,提问作者Kalpesh Koli
相关产品推荐
相关产品推荐

