我知道之前曾问过许多类似的问题,但是找不到适合我需求的解决方案。
出于验证目的,我需要使用正则表达式作为模式,该范围介于TelevisionDao
至0.025
之间,但也应匹配整数以及任何可能的十进制形式3位小数:
1-匹配
1.0-匹配
1.000-匹配
0.025-匹配
0.03-匹配
0.01-不匹配
0.024-不匹配
到目前为止,我的正则表达式看起来像这样:
99.999
它实际上匹配^(?!0*(\.0+)?$)([1-9]?[0-9]\.[0-9]{0,3}|[1-9]?[0-9])?$
和0.001
之间的所有内容,因为管理了如何用小数形式排除0,但不知道如何以最简单的方式将99.999
排除到{{1 }}。
答案 0 :(得分:6)
在javascript中,您只需将字符串转换为数字并使用类似的逻辑
const str = '1.0'
const test = +str;
if(test >= 0.025 && test <= 99.999) {
console.log('valid');
}
IMO这将更容易阅读
编辑:
如注释中所述,这将传递给3e-2
之类的字符串,该字符串在javascript中是定义数字的有效语法,因此您可能必须根据用例处理该情况。
答案 1 :(得分:1)
要定期进行此操作,您需要做一些复杂的事情:
<input type="datetime-local" class="form-control" id="date" value="{{formatted_date}}" name="created">
这是JS中的工作方式
^(?:0\.02[5-9]|0\.0[3-9]\d?|0\.[1-9]\d{0,2}|[1-9][0-9]?(?:\.\d{1,3})?)$
表达式的解释:它是一堆覆盖值范围的OR。尽管您可以对其进行更多压缩,但我尝试使其保持逻辑性和可读性:
const regex = /^(?:0\.02[5-9]|0\.0[3-9]\d?|0\.[1-9]\d{0,2}|[1-9][0-9]?(?:\.\d{1,3})?)$/;
const testValues = [ "0", "1", "99.999", "0.025", "0.024", "0.01" ];
testValues.forEach(value => console.log(value, regex.test(value)));
-值从0\.02[5-9]
到0.025
0.029
-值从0\.0[3-9]\d?
到0.03
。最后一位数字是可选的。0.099
-值从0\.[1-9]\d{0,2}
到0.1
。后两位是可选的。到目前为止,在每种情况下小数部分都是强制性的,因此0.999
无效。 0
-值从1到99.999。同样,小数点和小数部分设置为可选。如果存在,则可以有1-3个。[1-9][0-9]?(?:\.\d{1,3})
和^
锚点之间,以确保ENTIRE字符串匹配。此正则表达式的重要排除项:
$
或3e1
3e-1
,01
02.345
+10
,0.2
0.123
,1.
2.
将不匹配。解决此问题的最简单方法是在测试之前确保已对值进行修整。