接受整数、小数值和最大值限制的正则表达式

Regular expression for accepting integers, decimal values and limiting by maximum value

我需要一个只接受从 1 到 9999.99 的整数或小数的正则表达式。我试过这个

^(?:[1-9][0-9]{0,4}(?:.d{1,2})?|9999|9999.99)$

但它也接受 10000。

试试这个正则表达式:

^0*(?!\.\d+)[1-9]\d{0,3}(?:\.\d{1,2})?$

Demo

解释:

  • ^ - 匹配字符串的开头
  • 0* - 匹配出现 0 次以上的数字 0
  • (?!\.\d+) - 如果当前位置后面没有 . 和 1+ 位数字
  • ,则为零长度匹配
  • [1-9] - 匹配从 1 到 9 的数字
  • \d{0,3} - 匹配至少 0 次或最多 3 次出现的数字
  • (?:\.\d{1,2})? - 匹配小数点 . 后跟 1 或 2 位数字。末尾的 ? 使小数部分可选
  • $ - 匹配字符串的结尾

模式中存在一些问题:

  • 这部分[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 demo

另一个想法,但在性能方面没有太大差异(只是为了好玩)。

^(?!0)\d{1,4}(?:\.\d\d?)?$

looakhead (?!0) 防止从零开始,所以我们可以进一步匹配 \d{1,4}.

不遵守前导零。 See this demo at regex101.