regex 正则表达式查找十进制/浮点数?

n3h0vuf2  于 2023-08-08  发布在  其他
关注(0)|答案(9)|浏览(101)

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

svgewumm

svgewumm1#

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

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

字符串
RegexPal

jljoyd4f

jljoyd4f2#

正确的表达式应如下所示:

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

6tr1vspr

6tr1vspr3#

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

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

字符串

3df52oht

3df52oht4#

  • 这是一个老帖子,但它是“浮点正则表达式”或类似的搜索结果的顶部,并没有完全回答_my_ question。既然我已经解决了,我会分享我的结果,这样下一个遇到这个线程的人就不必自己解决了。

到目前为止,所有的答案都接受小数点左边有两个(或更多)数字的前导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/
这将在"negative pi is approximately -3.14.""(-3.14)"中找到-3.14等。
编号的组与上面的含义相同(除了当没有前导符号时,$2现在是空字符串(""),而不是null)。
但要注意,它也会尝试提取它能找到的任何数字。例如,它将从127.0.0.1中提取127.0
如果你想要更复杂的东西,那么我认为你可能想看看词法分析,而不是正则表达式。我猜可以创建一个基于前瞻的表达式,该表达式将识别"Pi is 3.14."包含浮点数,而Home is 127.0.0.1.不包含浮点数,但它充其量是复杂的。如果您的模式以非平凡的方式依赖于后面的字符,那么您就开始在正则表达式的最佳位置之外冒险。

czq61nw1

czq61nw15#

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

字符串

f0ofjuux

f0ofjuux6#

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

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)将返回数组,其中第一个元素包含符合的部分。我在input元素的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;
}

字符串

waxmsbnn

waxmsbnn7#

对于任何新的:
我为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中将所有[0-9]替换为\d
并可能在RegExp的末尾添加Unicode标志u
要更好地理解该模式,请访问https://regexper.com/。
对于正则表达式,我建议使用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


使用Number()将字符串转换为数字(或NaN
然后用!Number.isNaN()检查它是否不是NaN
编辑3:找到另一个很酷的网站:参见this regexp on debuggex.com

ttvkxqim

ttvkxqim8#

如果你想让它与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'));

zzwlnbp8

zzwlnbp89#

这里有一个更严谨的答案

^[+-]?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]*,例如。十二点三、一点二、一百零五点六
匹配点一次,无限位跟随它.[0-9]*$

现在看第三部分

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


这将检查值的起始位置。例如.12、.34565
^[+-]?同上
匹配点一次,然后匹配一个或多个数字.[0-9]+$

相关问题