正则表达式问题:不允许单个点仅当点前有数字或点后有数字时才允许

问题描述

我想允许用户键入以下十进制或整数值(A)

.5
0.500
3
0
0.0
30
500000
4000.22
0.

这是我使用过的以下正则表达式:

factor: /^-?\d*[.]??\d*$/,

但是问题是上面的正则表达式还允许以下无效数字(B)

        . (comment: a single dot )
       00.5 (multiple zeros before dot)
      0000.5
       00 (multiple zeros)

也不允许用户输入负值,即-3,-0.5

我正在尝试修改上述正则表达式,以允许(B)处的无效值,但允许(A)处的值

我的尝试无效:

 factor: /^-?\d*[.]+\d*$/,

解决方法

尝试以下正则表达式:

^-?[1-9]*?0?(\.\d+)?$

Example Demo

,

您可以匹配一个可选的连字符,然后断言该字符串不是以2个零开头。

然后匹配可选数字,可选点和1+个数字,以防止匹配空字符串。

^-?(?!00)\d*\.?\d+$
  • ^字符串的开头
  • -?匹配可选的-
  • (?!00)负向查找,在右边不断言2个零
  • \d*匹配0+个数字
  • \.?匹配可选的.
  • \d+匹配1个以上的数字
  • $字符串结尾

Regex demo

const regex = /^-?(?!00)\d*\.?\d+$/;
[
  ".5","0.500","3","0","0.0","30","500000","4000.22",".","00.5","0000.5","00","-4000","-0","-00",","00.4"
].forEach(s => console.log(`${s} --> ${regex.test(s)}`));

,

您可以使用以下表达式,该表达式根据点之前的数字来计算点。

^-?(((?!00)\d+(?:\.{1}\d*)*)|((?!00)\d*(?:\.{1}\d+)))?$

Demo link

,

尝试此正则表达式<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/6.2.0/d3.min.js"></script> <svg></svg>

中括号表示您可以输入0或1位数字。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...