首页 > 解决方案 > 数字范围的正则表达式约束,限制为小数点后 3 位

问题描述

对于输入验证(约束用户,使他们不能输入错误的输入),我想在 JavaScript 中创建一个正则表达式来约束,以便:

有两个数字,用连字符隔开,每个数字末尾可以有一个小数点,后跟最多三个数字(3dp)

任何输入到此的内容都应该通过正则表达式,所以;

0
02
023.
023.2
023.22
023.223-
023.223-3
023.223-33
023.223-333
023.223-333.
023.223-333.3
023.223-333.33
023.223-333.333

都是有效值,例如,此格式之外的任何内容都应该是无效的;

0.2343
0.233-0.2343

我在验证连字符两边的数字方面取得了一些成功;

^\d*\.?(\d{1,3})?$

然后我在两边都包括这个,中间有一个连字符;

^\d*\.?(\d{1,3})?\-?\d*\.?(\d{1,3})?$

在这里查看:https ://regex101.com/r/klw01G/1

这个解决方案的问题是它允许第一个数字集有无限的小数位。我很困惑,因为它按预期适用于第二组,仅限于 3dp。

将第一组限制为 3dp 的解决方案是什么?必须有基于.角色的条件吗?

标签: javascriptregex

解决方案


您需要嵌套可选组:

^\d+(?:\.\d{0,3}(?:-(?:\d+(?:\.\d{0,3})?)?)?)?$

请参阅正则表达式演示正则表达式图

在此处输入图像描述

如果您还需要允许空字符串,请使用可选组将整个部分包裹在^$锚点之间:

^(?:\d+(?:\.\d{0,3}(?:-(?:\d+(?:\.\d{0,3})?)?)?)?)?$

细节

  • ^- 字符串的开始
  • \d+- 1+ 位数
  • (?:\.\d{0,3}(?:-(?:\d+(?:\.\d{0,3})?)?)?)?- 一个可选的序列
    • \.\d{0,3}-.和 0 到 3 位数字
    • (?:-(?:\d+(?:\.\d{0,3})?)?)?- 一个可选的序列
    • -- 一个连字符
    • (?:\d+(?:\.\d{0,3})?)?- 一个可选的序列
      • \d+- 1+ 位数
      • (?:\.\d{0,3})?- 一个点的可选序列,然后是 0 到 3 位数字
  • $- 字符串结束

推荐阅读