数字和前导零的正则表达式仅带有点和小数
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 位数字匹配
$
字符串结束
您可以使用
^(?![0.]+$)(?:[1-9]\d*|0)(?:\.\d{1,2})?$
参见regex demo。
详情:
^
- 字符串开头
(?![0.]+$)
- 如果直到字符串结尾只有零或点,则匹配失败
(?:[1-9]\d*|0)
- non-zero 数字后跟任何零个或多个数字或零
(?:\.\d{1,2})?
- 可选地后跟一系列 .
和一个或两个数字
$
- 字符串结尾。
我正在尝试寻找数字输入的正则表达式。只要我们添加一个点来添加 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.”,不带点后面的数字)。
更好的选择
\d+
应该替换为 \d{1,2}
,因为你不想要超过 2 个数字。
如果支持否定前瞻,您可以排除以零开头且没有小数部分的匹配项。
^(?!0\d*$)\d+(?:\.\d{1,2})?$
^
字符串开头(?!0+\d*$)
否定前瞻,断言不是零后跟右边的可选数字\d+
匹配 1+ 个数字(?:\.\d{1,2})?
将可选的小数部分与 1 位或 2 位数字匹配$
字符串结束
您可以使用
^(?![0.]+$)(?:[1-9]\d*|0)(?:\.\d{1,2})?$
参见regex demo。
详情:
^
- 字符串开头(?![0.]+$)
- 如果直到字符串结尾只有零或点,则匹配失败(?:[1-9]\d*|0)
- non-zero 数字后跟任何零个或多个数字或零(?:\.\d{1,2})?
- 可选地后跟一系列.
和一个或两个数字$
- 字符串结尾。