数字和前导零的正则表达式仅带有点和小数

Regex expression for numbers and leading zeros just with a dot and decimal

我正在尝试寻找数字输入的正则表达式。只要我们添加一个点来添加 1 或 2 个小数,我们就可以收到前导 0。当然只接受数字。

这些是我们可以接受的场景:

0.01 
1.1
1.02
120.01

我们不能接受这些值

0023
0100
.01
.12

哪个正则表达式是这些情况的最佳选择?

到目前为止,我们尝试使用以下正则表达式来仅接受数字和点

[A-Za-z,]

我们也尝试使用以下的:

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

"/^[-]?[$]\d{1,3}(?:,?\d{3})*\.\d{2}$/"

"/(^(\d{1})\.{0,1}([0-9]){0,2}$)|(^([1-9])\d{0,2}(\,\d{0,3})$)/g"

(?:0|[1-9][0-9]*)(?:\.[0-9]{1,2})?

下一个用于删除前导零,但它不适用于 0.10 个案例

^0+

我会选择 ^(0|[1-9]\d*|(0|[1-9]\d*)\.\d+)$

你可以在这里测试:https://regex101.com/r/oNMgR9/1

说明

  • ^ 表示:匹配字符串的开头(如果启用了 m 标志,则匹配行).
  • $ 表示:匹配字符串的末尾(如果启用了 m 标志,则匹配行).
  • (a|b) 表示 匹配“a” 匹配“b” 所以我将使用它来匹配“ 0" 或任何不以 "0" 开头的数字。它是逻辑 .
  • 的语法
  • . 单独用于匹配任何字符。所以如果你想匹配点字符,你必须转义它。这就是为什么我写 0\. 而不是 0..
  • [ ]用于列出你要匹配的一些字符。如果您使用 - 字符,它可以是一个范围,因此 [1-9] 表示从“1”到“9”的任何数字字符。
  • \d就是匹配一个数字。它完全等同于 [0-9].
  • *表示:匹配前面的模式0次或多次,所以\d*表示它将匹配0次或多次一个数字,所以它将匹配“8”或“465”或“09”,但也匹配空字符串“”。如果你想匹配前面的模式至少一次或多次,那么你可以使用 + 而不是 *。所以 \d+ 不会匹配空字符串 "" 但 \d* 会匹配它。

A) 只是一个不以 0 开头的数字

[1-9]\d* 将匹配从 1 到 9 的任何数字,然后可选地后跟其他数字。这将匹配没有小数点的数字。

B) 仅 0

单独

0 是一种可能性。这是因为上面的案例没有涵盖它。

B) 带小数的数字

(0|[1-9]\d*)\.\d+ 将匹配单独的“0”或不以“0”开头的数字,然后是一个点和一些其他数字(必须存在,因为我们不想匹配“45.”,不带点后面的数字)。

更好的选择

使用负前瞻会更清晰一些。只是理解有点不同。他完整地阅读了这个问题:你想要小数点后的 1 或 2 位数字。我忘记了,所以,实际上,\d+ 应该替换为 \d{1,2},因为你不想要超过 2 个数字。

如果支持否定前瞻,您可以排除以零开头且没有小数部分的匹配项。

^(?!0\d*$)\d+(?:\.\d{1,2})?$
  • ^ 字符串开头
  • (?!0+\d*$) 否定前瞻,断言不是零后跟右边的可选数字
  • \d+ 匹配 1+ 个数字
  • (?:\.\d{1,2})? 将可选的小数部分与 1 位或 2 位数字匹配
  • $ 字符串结束

Regex demo

您可以使用

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

参见regex demo

详情:

  • ^ - 字符串开头
  • (?![0.]+$) - 如果直到字符串结尾只有零或点,则匹配失败
  • (?:[1-9]\d*|0) - non-zero 数字后跟任何零个或多个数字或零
  • (?:\.\d{1,2})? - 可选地后跟一系列 . 和一个或两个数字
  • $ - 字符串结尾。