用于查找十进制/浮点数的正则表达式?

IT技术 javascript regex floating-point decimal
2021-01-31 01:14:02

我需要一个十进制/浮点数的正则表达式,如 12 12.2 1236.32 123.333 和 +12.00 或 -12.00 或 ...123.123... 用于在 javascript 和 jQuery 中使用。谢谢你。

6个回答

可选地在开头匹配 + 或 -,后跟一个或多个十进制数字,可选后跟一个小数点和一个或多个十进制数字 util 字符串的结尾:

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

正则表达式

@AralRoca OP 没有迹象表明他们希望它与e.
2021-03-17 01:14:02
减号不应该[+-]像这样转义[+\-]吗?
2021-03-21 01:14:02
@jfriend00 不,不必如此。它不可能是一个范围,因为它是类中的最后一个字符,所以它是一个字面减号。只需在您的控制台中试试这个:/^[+-]?\d+(\.\d+)?$/.test('-1')
2021-03-29 01:14:02
@jfriend00 如果减号是字符类中的第一个或最后一个字符,则它从字面上指定一个减号。所以在这种情况下,所有[+-], [-+], [+\-], 和[\-+]都是等价的。
2021-04-12 01:14:02
@James 它适用于0.99. 如果要允许它以小数开头,请将第一个更改\d+\d*.
2021-04-13 01:14:02

正确的表达方式应该如下:

[+-]?([0-9]*[.])?[0-9]+

这适用于:

+1
+1.
+.1
+0.1
1
1.
.1
0.1

这是 Python 示例:

import re
#print if found
print(bool(re.search(r'[+-]?([0-9]*[.])?[0-9]+', '1.0')))
#print result
print(re.search(r'[+-]?([0-9]*[.])?[0-9]+', '1.0').group(0))

输出:

True
1.0

如果你使用的是 mac,你可以在命令行上测试:

python -c "import re; print(bool(re.search(r'[+-]?([0-9]*[.])?[0-9]+', '1.0')))"

python -c "import re; print(re.search(r'[+-]?([0-9]*[.])?[0-9]+', '1.0').group(0))"
这是更好的答案,因为我可以放置像 9.5 毫米或 9.5 英寸等的 mesires。谢谢 +1
2021-03-26 01:14:02
似乎不包括这些情况:23..8789 或 4587.387.987。这对我有帮助:stackoverflow.com/a/30461355/1783439
2021-04-05 01:14:02

您可以使用 isNaN 检查文本验证以及仅一位小数点验证

var val = $('#textbox').val();
var floatValues =  /[+-]?([0-9]*[.])?[0-9]+/;
 if (val.match(floatValues) && !isNaN(val)) {
  // your function
}

这是一篇旧帖子,但它是“浮点正则表达式”或类似内容的最高搜索结果,并没有完全回答_我的_问题。既然我已经解决了,我将分享我的结果,这样下一个遇到这个线程的人就不必自己解决了。

到目前为止,所有答案都接受0在小数点左侧有两个(或更多)数字的数字前导(例如,0123而不是仅仅123)这不是真正有效的,在某些情况下用于指示数字是八进制的(base-8) 而不是常规的十进制 (base-10) 格式。

此外,这些表达式接受没有前导零(.14代替0.14)或没有尾随小数部分(3.代替3.0)的小数这在某些编程上下文(包括 JavaScript)中是有效的,但我想禁止它们(因为就我而言,这些更可能是错误而不是故意的)。

忽略“科学记数法”之类的1.234E7,这里有一个符合我标准的表达式:

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

或者如果你真的想接受一个领先的+,那么:

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

我相信正则表达式会对典型的整数或十进制式的浮点数进行严格的测试。

匹配时:

  • $1 包含匹配的完整数字
  • $2 包含(可能为空)前导符号 (+/-)
  • $3 包含小数点左边的值
  • $5 包含小数点右边的值,包括前导 .

“严格”是指数字必须是您正在测试的字符串中的唯一内容。

如果您只想从包含其他内容的字符串中提取浮点值,请使用以下表达式:

/((\b|\+|-)(0|([1-9][0-9]*))(\.[0-9]+)?)\b/

哪个会找到-3.14in"negative pi is approximately -3.14."或 in"(-3.14)"等。

编号组具有与上述相同的含义(除了当没有前导符号时$2现在是空字符串 ( "") 而不是null)。

但请注意,它还会尝试提取它可以找到的任何数字。例如,它将127.0127.0.0.1.

如果您想要比这更复杂的东西,那么我认为您可能需要查看词法分析而不是正则表达式。我猜可以创建一个基于前瞻的表达式,它可以识别"Pi is 3.14."包含浮点数但Home is 127.0.0.1.包含浮点数 的表达式,但充其量它会很复杂。如果您的模式以非平凡的方式依赖于它后面的字符,那么您就开始在正则表达式的最佳位置之外冒险。

Paulpro 和 lbsweek 的回答让我想到了这个:

re=/^[+-]?(?:\d*\.)?\d+$/;
>> /^[+-]?(?:\d*\.)?\d+$/

re.exec("1")
>> Array [ "1" ]

re.exec("1.5")
>> Array [ "1.5" ]

re.exec("-1")
>> Array [ "-1" ]

re.exec("-1.5")
>> Array [ "-1.5" ]

re.exec(".5")
>> Array [ ".5" ]

re.exec("")
>> null

re.exec("qsdq")
>> null