用于接受整数、十进制值和按最大值限制的正则表达式



我需要一个只接受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中查看此演示。

最新更新