【问题标题】:Regular expression validator accept number with decimal numbers 0 or 5 in range 0-5正则表达式验证器接受范围为 0-5 的十进制数 0 或 5 的数字
【发布时间】:2014-07-20 00:45:45
【问题描述】:

我正在尝试编写正则表达式验证器以仅接受小数部分为 0 或 5 且范围为 0-5 的数字。例如:

-1          false
-.5         false
-0          false

000000      true
0.0         true
0000.       true
0           true
.50000000   true
00001.      true
01.50       true
2.00000     true
2.5000      true
03          true
03.5        true
0004        true
0004.5000   true
00005.0     true

0           true
0.5         true
1           true
1.5         true
2           true
2.5         true
3           true
3.5         true
4           true
4.5         true
5           true

1.05        false
5.5         false
10          false
20          false
30          false
40          false
50          false

无论数字前面或后面有多少个0,它都可以是有效的。

我试过这个^[0-5]+(?:\.[05]0?)?$,但在以下情况下失败了:0000..5001.5.5

非常感谢!

【问题讨论】:

  • 55.0 应该返回什么?
  • 是的,我想丢弃任何不是 .5 或 .0 的十进制数

标签: regex


【解决方案1】:

你可以使用

^0*(?:[0-4]?(?:\.5?0*)?|5(?:\.0*)?)$

解释:

^0*                  # allow leading 0s
    (?:              # non capturing group
        [0-4]?       # below 5: number starts with 0-4
        (?:\.5?0*)?  # optional: decimal dot, might be followed by one 5 and 0s.
    |                # or
        5(?:\.0*)?   # 5, possibly followed by 0s
    )
$

请注意,这也会验证空字符串或单个 .。告诉我这是否是个问题,作为快速修复,您可以在开头添加前瞻性以检查长度和内容:(?=.)(?!\.$)

demo here

【讨论】:

  • 我是正则表达式的新手 感谢您的解释! @罗宾
  • @Robin 你能知道如何把这个正则表达式放在 php preg_match() 中吗?它说“ErrorException:preg_match():没有找到结束分隔符'/'”......
  • 您必须将模式放在/... / 分隔符中:类似于preg_match('/regex/',...) 。我现在不能发布太多代码,但是 regex101(左中)上有一个代码生成器应该很有用。
  • 谢谢,我在 preg_match('/^0*(?:[0-4]?(?:\.5?0*)?|5(?:\.0*) ?)$/', '5') 这很好。但是,我在 Laravel 验证中遇到了异常。也许我以其他方式找到了解决方案。
  • @ChrisSo 我不熟悉 Laravel 但正则表达式包含 |this 可能是您的问题吗?另外仅供参考,cmets 的内联代码格式是使用反引号 ` 完成的
【解决方案2】:

您可以使用以下内容:

^0*5(?:\.0*)?$|^0*[1-4]?(?:\.[05]?0*)?$

Demo

【讨论】:

    【解决方案3】:

    这应该可以解决问题:

    ^0*([0-4]?(\.[05]?0*)?|5(\.0*)?)$
    

    http://rubular.com/r/bDM7mOHL54

    【讨论】:

    • 小心,因为这也会验证40:当十进制数字匹配时,\. 必须在此处
    • 哎呀,但我只想要 0-5 范围
    • 它仍然验证500 :) 另外,请记住(0|5)[05]
    【解决方案4】:

    这是另一个:

    ^0*(([0-4]?(\.5?0*)?)|(5(\.0*)?))$
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-05
      • 2018-03-02
      • 2011-09-24
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多