【问题标题】:regex for price validation用于价格验证的正则表达式
【发布时间】:2015-09-09 14:52:12
【问题描述】:

我正在尝试找到一个正则表达式,它接受小数点前最多 5 位数字和小数点后最多 2 位数字。小数部分是可选的,如果 0 是唯一的数字,则不应接受。但如果 0 后跟小数点后或之前的其他数字,则接受。 例如:

有效数据为:12345.12,123.12,0.12,00.12,1.2,0123.12

无效数据为:0,00,000,0000,00000

我已经做了一个表达式^\d{0,5}(\.\d{1,2})?$",但是如果数字以 0 开头,这将不起作用。

【问题讨论】:

  • 你允许空字符串和像00001.01这样的值吗?
  • 不允许使用空字符串,但 00001.01 等值有效

标签: regex


【解决方案1】:
^(?!0+$)\d{0,5}(.\d{1,2})?$

 ^^^^^^^

只需添加一个lookahead,如果它只找到0,它将使正则表达式失败。

编辑:

如果你不想让0.0 使用

^(?!0+(\.0+)?$)\d{0,5}(.\d{1,2})?$

【讨论】:

    【解决方案2】:

    这也有效:

    ^\d{0,5}(?!(\.|,)0{2})(\.|,)\d{1,2}$
    

    (?!(\.|,)0{2}) 断言该数字在小数点后不只包含0s。

    Demo on regex101

    【讨论】:

      【解决方案3】:

      不允许空字符串,但像 00001.01 这样的值是有效的

      您可以使用以下正则表达式和负前瞻来检查不允许的值:

       ^(?!$)(?!0+$)\d{0,5}(?:\.(?!0{1,2}$)\d{1,2})?$
        ^^^^^ ^^^^^              ^^^^^^^^^
      

      demo

      正则表达式分解:

      • ^ - 字符串开头
      • (?!$) - 确保字符串不为空(字符串的结尾不会出现在开头之后)
      • (?!0+$) - 确保整数不只包含零
      • \d{0,5} - 0 到 5 位
      • (?:\.(?!0{1,2}$)\d{1,2})? - 可选序列...
        • \. - 一个小数点
        • (?!0{1,2}$)\d{1,2} - 不是 000 ((?!0{1,2}$)) 的 2 位或 1 位数字 (\d{1,2})
      • $ - 字符串结束

      【讨论】:

      • 我已经更新了我的答案,似乎只有我的正则表达式不允许空字符串,并且只有00000000.00000.00
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 2016-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多