Javascript 查找十进制/浮点数的正则表达式?
我需要一个十进制/浮点数的正则表达式,如12 12.2 1236.32 123.333和+12.00或-12.00或…123.123。。。用于javascript和jQuery中。Javascript 查找十进制/浮点数的正则表达式?,javascript,regex,floating-point,decimal,Javascript,Regex,Floating Point,Decimal,我需要一个十进制/浮点数的正则表达式,如12 12.2 1236.32 123.333和+12.00或-12.00或…123.123。。。用于javascript和jQuery中。 谢谢。可选择在开始处匹配+或-,后跟一个或多个十进制数字,可选择后跟一个小数点,并在字符串末尾匹配一个或多个十进制数字: /^[+-]?\d+(\.\d+)?$/ 正确的表达式应如下所示: [+-]?([0-9]*[.])?[0-9]+ 这适用于: +1 +1. +.1 +0.1 1 1. .1 0.1 以下是
谢谢。可选择在开始处匹配+或-,后跟一个或多个十进制数字,可选择后跟一个小数点,并在字符串末尾匹配一个或多个十进制数字:
/^[+-]?\d+(\.\d+)?$/
正确的表达式应如下所示:
[+-]?([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))"
您可以使用isNaN检查文本验证,也可以只检查一个小数点验证
var val = $('#textbox').val();
var floatValues = /[+-]?([0-9]*[.])?[0-9]+/;
if (val.match(floatValues) && !isNaN(val)) {
// your function
}
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
这是一篇老文章,但它是“浮点正则表达式”或类似内容的顶级搜索结果,并没有完全回答我的问题。既然我已经解决了这个问题,我将分享我的结果,这样下一个遇到这个问题的人就不必自己解决了
到目前为止,所有答案都接受小数点左侧有两个(或更多)数字的数字的前导0
(例如0123
,而不仅仅是123
),这并不是真正有效的,在某些上下文中用于指示数字是八进制(基数-8)格式,而不是常规的十进制(基数-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/
在“负pi约为-3.14。”
或“(-3.14)”
等中可以找到-3.14
编号的组与上面的含义相同(除了当没有前导符号时,$2
现在是空字符串(”
),而不是null
)
但请注意,它也会试图提取它能找到的任何数字。例如,它将从127.0.0.1
中提取127.0
如果你想要比这更复杂的东西,那么我想你可能想看看词法分析,而不是正则表达式。我猜可以创建一个基于前瞻性的表达式,该表达式可以识别出“Pi是3.14。”
包含一个浮点数,但Home是127.0.0.1。
没有,但充其量也会很复杂。如果您的模式以非平凡的方式依赖于它后面的字符,那么您将开始尝试超出正则表达式的最佳范围。对于任何新用户:
我为E科学符号做了一个RegExp(没有空格)
如果您愿意使用,可以将RegExp中的所有[0-9]
替换为\d
。
并可能在RegExp的末尾添加Unicode标志u
要更好地理解模式,请参见。
对于制作RegExp,我可以建议
编辑:找到了另一个用于以彩色查看RegExp的站点:。是否应该像[+-]
那样转义[+\-]
?@jfriend00不,不需要转义。它不可能是一个范围,因为它是类中的最后一个字符,所以它是一个文字负号。只需在控制台中尝试以下操作:/^[+-]?\d+(\.\d+)$/.test('-1')
@jfriend00如果减号是字符类中的第一个或最后一个字符,它会按字面意思指定减号。所以在本例中,[+-]
、[-+]
、[+\-]
和[\-+]
都是等效的。@James它适用于0.99
。如果你想让它以十进制开始,把第一个\d+
改为\d*
@AralRoca,从OP上看没有迹象表明他们想让它与e
一起工作。这是一个更好的答案,因为我可以放9.5毫米或9.5英寸等。感谢这+1似乎不包括这些情况:23..8789或4587.387.987。这帮助了我:
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