55

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

4

8 回答 8

106

可选匹配开头的 + 或 -,后跟一个或多个小数位,可选后跟一个小数点和一个或多个小数位,直到字符串的结尾:

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

正则表达式

于 2012-04-21T04:02:03.387 回答
16

正确的表达式应该如下:

[+-]?([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))"
于 2016-12-08T10:24:25.727 回答
4

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

var val = $('#textbox').val();
var floatValues =  /[+-]?([0-9]*[.])?[0-9]+/;
 if (val.match(floatValues) && !isNaN(val)) {
  // your function
}
于 2018-04-24T11:15:14.713 回答
4

这是一篇旧帖子,但它是“浮点正则表达式”或类似内容的热门搜索结果,并不能完全回答 _my_ 问题。既然我已经解决了,我会分享我的结果,所以遇到这个线程的下一个人不必自己解决。

到目前为止,所有答案都接受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.不包含浮点数,但它充其量是复杂的。如果您的模式以非平凡的方式依赖于它之后的字符,那么您将开始冒险超出正则表达式的最佳位置。

于 2018-10-26T02:19:32.723 回答
3

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
于 2018-07-19T06:51:36.377 回答
2

对于任何新人:

我为 E 科学记数法(没有空格)做了一个正则表达式。

const floatR = /^([+-]?(?:[0-9]+(?:\.[0-9]+)?|\.[0-9]+)(?:[eE][+-]?[0-9]+)?)$/;
let str = "-2.3E23";
let m = floatR.exec(str);
parseFloat(m[1]); //=> -2.3e+23

如果您更喜欢使用Unicode 数字,您可以在 RegExp 中将all 替换[0-9]为。并且可能在 RegExp 的末尾 添加 Unicode 标志。\d
u

要更好地理解该模式,请参阅https://regexper.com/
对于制作 RegExp,我可以建议https://regex101.com/

编辑:找到另一个以颜色查看 RegExp 的站点:https ://jex.im/regulex/ 。

编辑 2:虽然 op 专门要求 RegExp,但您可以直接在 JS 中检查字符串:

const isNum = (num)=>!Number.isNaN(Number(num));
isNum("123.12345678E+3");//=> true
isNum("80F");//=> false

将字符串转换为数字(或NaN),然后Number()
检查它是否不是NaN!Number.isNaN()

于 2021-03-28T23:59:03.793 回答
0

这里有更严谨的答案

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

以下值将匹配(+- 符号也可以)

.11234
0.1143424
11.21
1.

以下值将不匹配

00.1
1.0.00
12.2350.0.0.0.0.
.
....

这个怎么运作

(?! regex ) 表示 NOT 操作

让我们通过 | 分解正则表达式 与逻辑或运算符相同的运算符

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

这个正则表达式是检查从 0 开始的值

首先检查 + 和 - 签名 0 或 1 次^[+-]

然后检查它是否有前导零0

如果有,那么它旁边的值不能为零,因为我们不想看到 00.123(?![0-9])

然后准确地检查一次点并检查无限次数字的小数部分.[0-9]*

最后,如果它后面有一个小数部分,我们将其丢弃。(?![.])$

现在看第二部分

^[+-]?[1-9]{1}[0-9]*.[0-9]*$

^[+-]?和上面一样

如果它从非零开始,则匹配第一个数字一次,然后无限次匹配,[1-9]{1}[0-9]*例如 12.3 , 1.2, 105.6

匹配点一次,无限位跟随它.[0-9]*$

现在看第三部分

^[+-]?.{1}[0-9]+$

这将检查值从 . 例如 .12、.34565

^[+-]?和上面一样

匹配点一次,后面跟着一个或多个数字.[0-9]+$

于 2021-08-01T03:27:26.903 回答
0

如果您希望它与 一起使用e,请使用以下表达式:

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

这是一个 JavaScript 示例:

var re = /^[+-]?[0-9]+([.][0-9]+)?([eE][+-]?[0-9]+)?$/;

console.log(re.test('1'));
console.log(re.test('1.5'));
console.log(re.test('-1'));
console.log(re.test('-1.5'));
console.log(re.test('1E-100'));
console.log(re.test('1E+100'));
console.log(re.test('.5'));
console.log(re.test('foo'));

于 2021-11-12T17:39:31.173 回答