Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript正则表达式:验证双精度/浮点值_Javascript_Regex_Validation_Floating Point - Fatal编程技术网

Javascript正则表达式:验证双精度/浮点值

Javascript正则表达式:验证双精度/浮点值,javascript,regex,validation,floating-point,Javascript,Regex,Validation,Floating Point,以下是我正在研究的模式: var re = /(\d{1,2}\.(?=\d{1,2}))/; 我希望返回的是一个一位或两位数字(它永远不会大于24,因为它用于时间管理应用程序),后面可能会或可能不会跟一个小数点,后面有一个或两个尾随数字,但不超过两个 我不确定插入的子串匹配是否与前瞻性匹配。我只是猜测并嵌套了它们。最后,如果我的语法是正确的,我想我唯一缺少的是如何建议模式可能有或可能没有前导数字,可能有或可能没有包含带试用数字的十进制 如果你需要更多信息,请告诉我 更新,示例: 我们只与时间

以下是我正在研究的模式:

var re = /(\d{1,2}\.(?=\d{1,2}))/;
我希望返回的是一个一位或两位数字(它永远不会大于24,因为它用于时间管理应用程序),后面可能会或可能不会跟一个小数点,后面有一个或两个尾随数字,但不超过两个

我不确定插入的子串匹配是否与前瞻性匹配。我只是猜测并嵌套了它们。最后,如果我的语法是正确的,我想我唯一缺少的是如何建议模式可能有或可能没有前导数字,可能有或可能没有包含带试用数字的十进制

如果你需要更多信息,请告诉我

更新,示例:

我们只与时间打交道,一天之内不会有更多的时间。24将是最高的投入

有效期:

23.75
1.4 
1
0.5 
0
.2
无效:

1.897
%#$#@$#
Words
other characters
最新更新:

因为这是一个小数,23.75行。我们不是数分钟,而是数小时的分数


另外,为了记录在案,我尝试使用方法和条件进行验证,它让字母在小数后通过。我已经决定使用正则表达式。

你可以试试这个正则表达式

^(?![3-9]\d|[2][5-9]|24[.])\d{1,2}([.]\d{1,2})?$
但这里不需要使用正则表达式,只需将字符串解析为数字,然后检查它是否小于或等于24

([1]?[0-9])|((20)|(21)|(22)|(23)|(24)){0,1}([.][0-9]{0,2})?
编辑:我建议您只在正则表达式中进行简单的检查,并在其他地方测试语义正确性(例如小于24),因为它变得非常复杂。时间也不允许23:74,但允许23:59…

如果“给定的任何数字都将小于24”,因此不需要单独测试,则以下表达式将起作用

^\d{0,2}(\.\d{0,2}){0,1}$

测试依据:

23.75             pass
1.4               pass
1                 pass
0.5               pass
0                 pass
.2                pass
1.897             fail
%#$#@$#           fail
Words             fail
other characters  fail
说明:

^             start matching at the start of the string
\d{0,2}       look for zero to two digits
(   ){0,1}$   look for this next thing zero or one time, then the end of the string
\.\d{0,2}     match exactly one decimal followed by up to two digits
注意-此正则表达式与“空字符串”不匹配。如果有可能会以某种方式出现在这个表达式中,您可能需要单独测试它

在javascript中测试的简单代码:

var str = "12.345";
var m = str.match(/^\d{0,2}(?:\.\d{0,2}){0,1}$/);
var goodTime;
if (!m) {
    alert(str + " is not a good time");
}
else {
    goodTime = m[0];
    alert("found a good time: " + goodTime);
}

注意-我对
regex
进行了调整-在“小数点后的位”组中添加了
?:
。这只意味着“匹配但不捕获”,因此结果将只返回匹配的
m[0]
,而不是
m[1]
中的组
.34
。实际上这并不重要,因为我在m[0]中指定了
goodTime
值(但仅当它是一个好时间时)。你可以在行动中看到这一点

你能举几个例子说明你想为某个特定输入获得的输出吗?您确定分隔符总是一个
,并且从不说
?如果输入是
123.456
您希望发生什么?我用示例更新了条目。为什么要使用regex来执行此操作?您想用12.345做什么?它是有效的,无效的,你是把它截短到12.34还是四舍五入到12.35?您如何确定数字不会大于24,但它可能是一个字符串?关于
12.89PM
,您想做什么?关于
12,45
(这是欧洲人写
12.45
的方式)注意
23.75
是有效的-我认为OP使用的是“十进制时间”而不是
HH:MM
,我将在其他地方检查空的、空的、未定义的等等。一旦字符串被验证并输入为double,我就必须进行其他检查。我得好好玩玩,但我想这会管用的。TY您不尝试替换-只需匹配:
var str=“12.34”;var m=str.match(/^\d{0,2}(\.\d{0,2}){0,1}$/)
m[0]
将包含匹配项(如果存在)。否则它将是空的。我已经更新了我的答案,在最后加了一个“告诉你好像你什么都不知道”的字。。。别担心,我们都去过。让我知道它现在是否清楚和解决了-在这种情况下,您可能会决定“接受”给出的答案之一(带有小复选标记)。您是否使用我的代码的最新版本(2小时前更新)-即“在Javascript中测试的简单代码”?变量
goodTime
中应该有正确的答案。。。两个技巧-我稍微更改了表达式(添加了
?:
)并显式访问
m[0]
,以获得答案。这一个不够高!感谢您提供的解决方案和酷站点
Rubular