我需要一个只接受1到9999.99之间的整数或小数的正则表达式。我试过这个
^(?:[1-9][0-9]{0,4}(?:.d{1,2})?|9999|9999.99)$
但它也接受10000。
模式中有几个问题:
- 这部分
[1-9][0-9]{0,4}
可以匹配1-5位数字,因为量词是0-4倍,所以它也可以匹配10000 - 您不需要
9999|9999.99
,因为1-9][0-9]{0,4}
已经可以匹配这些 - 此部分
.d
匹配除换行符后面跟有d
字符之外的任何字符。你必须同时转义才能真正匹配一个点和一个个个数字 - 通过这些更改,您可以省略外部捕获组
更新后的模式看起来像:
^[1-9]d{0,3}(?:.d{1,2})?$
^
字符串开始[1-9]d{0,3}
匹配一个数字1-9,并重复0到3次数字0-9(?:.d{1,2})?
可选地匹配.
和1或2个数字$
字符串结束
Regex演示
试试这个正则表达式:
^0*(?!.d+)[1-9]d{0,3}(?:.d{1,2})?$
演示
解释:
^
-匹配字符串的开头0*
-匹配数字0
的0次以上(?!.d+)
-如果当前位置后面没有.
和1+位数字,则零长度匹配[1-9]
-匹配1到9之间的数字d{0,3}
-匹配一个数字的至少0次或最多3次出现(?:.d{1,2})?
-匹配后面跟有1或2位数字的十进制.
。结尾处的?
使小数部分可选$
-匹配字符串的末尾
另一个想法,但在性能方面没有太大区别(只是为了好玩(。
^(?!0)d{1,4}(?:.dd?)?$
looakhead(?!0)
防止从零开始,因此我们可以进一步匹配d{1,4}
。
不尊重前导零。请在regex101中查看此演示。