我需要十进制/浮点数的正则表达式,例如 12 12.2 1236.32 123.333 和 +12.00 或 -12.00 或 ...123.123... 用于 javascript 和 jQuery。谢谢你。
8 回答
正确的表达式应该如下:
[+-]?([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
}
这是一篇旧帖子,但它是“浮点正则表达式”或类似内容的热门搜索结果,并不能完全回答 _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
in"negative pi is approximately -3.14."
或 in"(-3.14)"
等。
编号的组与上面的含义相同(除了现在没有前导符号时是$2
空字符串 ( ),而不是)。""
null
但请注意,它还会尝试提取它可以找到的任何数字。例如,它将127.0
从127.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
对于任何新人:
我为 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()
这里有更严谨的答案
^[+-]?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]+$
如果您希望它与 一起使用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'));