正则表达式范围太大

时间:2019-06-10 12:50:17

标签: regex floating-point integer

我创建了一个(通常)工作的正则表达式,该表达式可以接受任何大于0或小于等于12的数字,最多允许两位小数。问题在于它还接受12-13之间的数字,例如12.25,也可以是0。

我的正则表达式模式为/^\b(0*([0-9]|1[0-2]))\b\.?[0-9]{0,2}$/

如何更改此设置以防止0或大于12的数字被接受?

1 个答案:

答案 0 :(得分:2)

您可以使用

^(?=[^1-9]*[1-9])0*(?:(?:\d|1[01])?(?:\.[0-9]{0,2})?|12(?:\.0{0,2})?)$

请参见regex demoregex graph

enter image description here

如果要求小数点分隔符后面的数字,请用{0,2}替换{1,2}

^(?=[^1-9]*[1-9])0*(?:(?:\d|1[01])?(?:\.[0-9]{1,2})?|12(?:\.0{1,2})?)$

详细信息

  • ^-字符串的开头
  • (?=[^1-9]*[1-9])-一个正向的超前查询,除了从1到{{的数字之外,其他任何字符都需要一个字符,它需要一个非零数字(从91的数字)。 1}}
  • 9-任何0+前导零
  • 0*-一个非捕获组的开始:
    • (?:-(?:\d|1[01])?(?:\.[0-9]{1,2})?0个数字(可选,在第一个右括号后进行匹配,请参见11),后跟一个可选序列?和1至2位数字
    • .-或
    • |-12(?:\.0{1,2})?后跟12和1到2位数字
  • .-非捕获组的结尾
  • )-字符串结尾