[英]Regular expression for double number range validation
我正在寻找一个正则表达式来支持双精度数,且仅包含一个小数部分,范围在0.1到999.9之间
这意味着不允许以下值:
0
0.0 // less than lower bound
0.19 // fraction part is 2 digits, right '9' is extra
94.11 // fraction part is 2 digits, right '1' is extra
999.90 // fraction part is 2 digits, '0' is extra
9.0 // should be 9 or 9.1, 9.0 is wrong
1000 // is higher than upper bound
允许的:
1.1
55.5
999.9
我的正则表达式是:
(^(\.[1-9])?$|(^[1-9][0-9]{0,2}?(\.[1-9])?$))$
不支持0.1
到0.9
以及额外的零,例如99.000
和99.0
测试步骤:在浏览器控制台中:
var reg = new RegExp(/(^(\.[1-9])?$|(^[1-9][0-9]{0,2}?(\.[1-9])?$))$/);
reg.test(12);
任何帮助
我猜这是最准确的:
/^(0\.[1-9]|[1-9][0-9]{0,2}(\.[1-9])?)$/
请注意,使用正则表达式文字时,不需要RegExp
构造函数:
re = /^(0\.[1-9]|[1-9][0-9]{0,2}(\.[1-9])?)$/
a = [0, 0.1, 123, 123.4, '00.1', 123.45, 123456, 'foo']
a.map(function(x) { console.log(x, re.test(x)) })
0 false
0.1 true
123 true
123.4 true
00.1 false
123.45 false
123456 false
foo false
这个怎么样:
var reg = new RegExp(/^\d{1,3}\.[1-9]$/);
它适用于您提供的所有肯定和否定案例。
我想我会添加另一种方法来实现这一点,我创建了一个node.js javascript库来自动生成这些范围。
要使用该库,您首先需要使用npm安装它:
$ npm install --save to-regex-range
然后使用以下代码将库添加到您的应用程序中
var toRegexRange = require('to-regex-range');
主要导出功能是一个采用两个整数的函数: min
和max
(格式为字符串或数字)。
例子
console.log(toRegexRange('111', '555'));
//=> 11[1-9]|1[2-9][0-9]|[2-4][0-9]{2}|5[0-4][0-9]|55[0-5]
console.log(toRegexRange('5', '5'));
//=> 5
console.log(toRegexRange('5', '6'));
//=> [5-6]
console.log(toRegexRange('51', '229'));
//=> 5[1-9]|[6-9][0-9]|1[0-9]{2}|2[0-2][0-9]
console.log(toRegexRange('29', '51'));
//=> 29|[3-4][0-9]|5[0-1]
console.log(toRegexRange('1', '100000'));
//=> [1-9]|[1-9][0-9]{1,4}|100000
自述文件包含更多文档和示例。
您根本不需要正则表达式。 一些简单(比正则表达式要快得多)的数学方程式可以完成此工作:
function testNumber(number) {
if (number < 0.1 || number > 999.9 || parseInt(10*number) != 10*number || number == parseInt(number))
return false;
return true;
}
alert( testNumber(12) );
在if
语句中,我们检查4件事:
如果以上任何条件为true,则te函数返回false 。
最好先使用Regex检查数字是否为双精度,然后再检查数字是否在范围内。 正则表达式等使业务逻辑模糊不清,这意味着您的代码难以维护。 而且,如果您必须将业务逻辑更新为其他数字,那么您将很难。
[-+]?([0-9]*\.[1-9]|[0-9]+)
上述Regex验证了浮点。 之后,您可以仅解析ParseFloat并比较其余的逻辑。
虽然您不应该使用Regexp比较数字范围,但以下是适合您的情况的一种方法:
/^(?:[1-9]\d{0,2}(?:\.[1-9])?)|(?:0\.[1-9])$/
示例(非锚定): http ://regex101.com/r/dY5pL3
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.