繁体   English   中英

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

[英]regular expression for finding decimal/float numbers?

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

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

/^[+-]?\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
}

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

到目前为止,所有答案都接受小数点左侧有两个(或更多)数字的数字的前导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.0.1提取127.0

如果您想要比这更复杂的东西,那么我认为您可能需要查看词法分析而不是正则表达式。 我猜可以创建一个基于前瞻的表达式来识别"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 科学记数法(无空格)制作了一个 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

如果您更喜欢使用Unicode numbers ,您可以在 RegExp 中用\\d替换所有[0-9]
并可能在 RegExp 的末尾添加 Unicode 标志u

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

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

这是我的js方法,处理字符串头部的0

1- ^0[0-9]+\.?[0-9]*$ :将查找以 0 开头的数字,然后在小数点分隔符之前查找大于零的数字,主要是“.”。 我把它用来区分包含数字的字符串,例如“0.111”和“01.111”。

2- ([1-9]{1}[0-9] \.?[0-9] ) :如果有以 0 开头的字符串,则将考虑大于 0 的部分。 此处使用括号是因为我只想捕获符合正则表达式的部分。

3- ([0-9] \.?[0-9] ) :仅捕获字符串的小数部分。

在 Javascript 中,st.match(regex) 将返回数组,其中第一个元素包含符合条件的部分。 我在输入元素的 onChange 事件中使用了这种方法,如果用户输入了违反正则表达式的内容,那么元素的值中根本不会显示违反部分的内容,但是如果有一部分符合正则表达式,则它会保留在元素的价值。

const floatRegexCheck = (st) => {
    const regx1 = new RegExp("^0[0-9]+\\.?[0-9]*$"); // for finding numbers starting with 0
    let regx2 = new RegExp("([1-9]{1}[0-9]*\\.?[0-9]*)"); //if regx1 matches then this will remove 0s at the head. 
    if (!st.match(regx1)) { 
        regx2 = new RegExp("([0-9]*\\.?[0-9]*)"); //if number does not contain 0 at the head of string then standard decimal formatting takes place
    }
    st = st.match(regx2);
    if (st?.length > 0) {
        st = st[0];
    }
    return st;
}

这是一个更严格的答案

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

如果您希望它与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'));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM