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

时间:2012-04-21 03:58:47

标签: javascript regex floating-point decimal

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

7 个答案:

答案 0 :(得分:64)

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

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

RegexPal

答案 1 :(得分:4)

正确的表达应如下:

[+-]?([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))"

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

对于任何新人:

我为 E 科学记数法制作了一个 RegExp (没有空格)

MATCH (n:person {name: 'bill'})-[r:livesAt]->(:place)   
WITH max(r.since) as most_recent, n
MATCH (n)-[:livesAt {since: most_recent}]->(m:place)
RETURN m

如果您更喜欢使用 Unicode numbers,则可以将 RegExp 中的所有 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 替换为 [0-9]
并可能在 RegExp 的末尾添加 Unicode 标志 \d

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

编辑:找到另一个网站以彩色查看正则表达式:https://jex.im/regulex/

答案 4 :(得分:0)

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

答案 5 :(得分:0)

这是一篇旧文章,但它是“浮点正则表达式”之类的热门搜索结果,并不能完全回答_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.14"negative pi is approximately -3.14."等中找到"(-3.14)"

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

但是请注意,它还将尝试提取可以找到的任何数字。例如,它将从127.0中提取127.0.0.1

如果您想要更复杂的东西,那么我想您可能希望看一下词法分析而不是正则表达式。我猜想一个人可以创建一个基于前瞻性的表达式,该表达式将识别出"Pi is 3.14."包含浮点数,而Home is 127.0.0.1.没有,但是充其量是很复杂的。如果您的模式以非平凡的方式依赖于其后的字符,那么您就会开始冒险去使用正则表达式的最佳位置。

答案 6 :(得分: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) 表示非操作

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

^[+-]?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]+$