如何在这个正则表达式中包含负小数?

131

如何在这个正则表达式中匹配负数?这个正则表达式可以很好地匹配正数,但我希望它也可以匹配负数,例如-10,-125.5等。

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

谢谢


http://www.regexper.com/ - Dave Bish
我尝试在开头添加[-],但这并没有起作用。我还尝试了一些小的组合更改。 - user1786107
请尝试使用此代码:^-?\d+(.\d+)?$ - Civa
17个回答

250
你应该在开头添加一个可选连字符,方法是添加 -?? 是一个表示出现一次或零次量词):
^-?[0-9]\d*(\.\d+)?$

我在 Rubular 上使用这些值进行了验证:

10.00
-10.00

两者都如预期匹配。

let r = new RegExp(/^-?[0-9]\d*(\.\d+)?$/);

//true
console.log(r.test('10'));
console.log(r.test('10.0'));
console.log(r.test('-10'));
console.log(r.test('-10.0'));
//false
console.log(r.test('--10'));
console.log(r.test('10-'));
console.log(r.test('1-0'));
console.log(r.test('10.-'));
console.log(r.test('10..0'));
console.log(r.test('10.0.1'));


4
你应该转义小数点,即 ^-?[0-9]\d*(\.\d+)?$ - Alex Shesterov
21
如果有可能需要明确捕获正数(在某些应用程序中使用的+10.00),您可以使用“^[-+]?[0-9]\d*(.\d+)?$”。 - Cemafor
4
为什么不用\d+替换[0-9]\d*呢?这样就可以得到^[-+]?\d+(\.\d+)?$ - Amin_mmz
1
你是否真的需要这个分组呢?^[-+]?\d*.?\d*$ 可匹配 33.0.3.3。根据应用程序,它可能更有用(例如输入验证)。 - nullromo

164

一些正则表达式示例:

正整数:

^\d+$

负整数:

^-\d+$

整数:

^-?\d+$

正数:

^\d*\.?\d+$

负数:

^-\d*\.?\d+$

正数或负数:

^-?\d*\.{0,1}\d+$

电话号码:

^\+?[\d\s]{3,}$

手机区号:

^\+?[\d\s]+\(?[\d\s]{10,}$

1900年至2099年:

^(19|20)[\d]{2,2}$

日期(dd mm yyyy、d/m/yyyy等):

^([1-9]|0[1-9]|[12][0-9]|3[01])\D([1-9]|0[1-9]|1[012])\D(19[0-9][0-9]|20[0-9][0-9])$

IP v4:


IPv4是一种使用32位地址的协议,它通常用于在Internet上标识设备。每个地址都由4个8位数值表示,通常以点分十进制数格式呈现(例如,192.0.2.1)。
^(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]){3}$

正整数的第一个正则表达式^\d+$包括零,但是0既不是正数也不是负数。对于正的非零整数,请尝试使用^[1-9]\d*$ - Joel

14

我不知道为什么你需要那个数字的第一个[0-9]

尝试:

^-?\d*(\.\d+)?$

更新

如果您想确保十位数上有一个数字,请使用

^-?\d+(\.\d+)?$

1
如果只是为了保证个位数是数字,那么 ^-?\d+(\.\d+)?$ 应该可以胜任。 - Cemafor

8

[0-9]表达式前添加"-"减号,然后跟随? quantifier应该可以解决问题。

-?[0-9]

参考资料

  • ^b - ^ quantifier匹配以"b"开头的任何字符串
  • c? - ? quantifier匹配0或1次出现的"c"
  • [0-9] - 查找[]括号内的任何字符
  • \d - 查找0-9中的数字
  • d* - * quantifier匹配零个或多个"d"的出现
  • \. - 匹配一个"."字符
  • z+ - + quantifier匹配一个或多个"z"的出现
  • e$ - $ quantifier匹配以"e"结尾的任何字符串

希望这样能帮助理解问题中发布的正则表达式.


3

最近我遇到了一个案例,学生们只在数字响应字段中输入被接受的字符,但仍然设法破坏了一些东西。因此,我最终使用了以下万能表达式。

^[+-]?((\d*\.?\d+)|(\d+\.?\d*))$

这确保了所有应该工作的事情都会工作,包括:

0
.0
0.0
-.11
+.2
-0.2
+01.
-123.
+123.4567890
-012.0
+1
-1.

该表达式还会拒绝淘气的孩子可能输入的一些东西,尽管它们仍然是有效的字符输入,但不是有效的数字,例如:
+.
-
.
(nul or newline)

我发现大多数人写的表达式(以 \d+$ 结尾)将会拒绝包含小数点但是小数点后面没有数字的数字。将该表达式改为以\d* 结尾,整个表达式将变得可选,从而导致它可以匹配上述第二个列表中的条目。但通过使用捕获组和布尔OR运算符(|)来要求至少在小数点之后或之前有至少一个数字,所有基本情况均被覆盖。

3

更新(2014年8月13日): 这是处理正负数的最佳代码 =)

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

我用这些数字试过了,效果很好:

-1234454.3435
-98.99
-12.9
-12.34
-10.001
-3
-0.001
-000
-0.00
0
0.00
00000001.1
0.01
1201.0000001
1234454.3435
7638.98701

2

If you have this val="-12XXX.0abc23" and you want to extract only the decimal number, in this case this regex (^-?[0-9]\d*(\.\d+)?$) will not help you to achieve it.
this is the proper code with the correct detection regex:

var val="-12XXX.0abc23";
val = val.replace(/^\.|[^-?\d\.]|\.(?=.*\.)|^0+(?=\d)/g, '');
console.log(val);


2
这将允许在数字后面仅使用-+字符:
 ^([+-](?=\.?\d))?(\d+)?(\.\d+)?$

2

我在Django的URL中进行了一些正则表达式实验,需要匹配从负数到正数的数字。

^(?P<pid>(\-\d+|\d+))$

让我们集中关注这个(\-\d+|\d+)部分,忽略其他内容,这个分号|在正则表达式中表示,因此负值将与\-\d+匹配,正值将与\d+匹配。


1

这将允许正整数和负整数

ValidationExpression="^-?[0-9]\d*(\d+)?$"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接