Javascript Regex: validating a double/float



以下是我正在处理的模式:

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有效。我们计算的不是分钟,而是小时的分数。

此外,为了记录在案,我尝试使用方法和条件句进行验证,让字母在小数后通过。我已经决定使用regex。

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

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

请参阅http://rubular.com/r/YDfHr5T5sQ

测试对象:

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(但前提是时机合适)。你可以在这里看到这一点

你可以试试这个regex

^(?![3-9]d|[2][5-9]|24[.])d{1,2}([.]d{1,2})?$

但是您不需要在这里使用regex,只需将字符串解析为数字,然后检查它是否小于或等于24

这个呢:

([1]?[0-9])|((20)|(21)|(22)|(23)|(24)){0,1}([.][0-9]{0,2})?

编辑:我建议你在RegEx中只做简单的检查,并在其他地方测试语义正确性(例如小于24),因为它会变得非常复杂。时间也不允许23:74,但允许23:59…

最新更新