var arr = [11.3,32,14.5,15,9,25,23,24]; var pattern = /^(([0-1]?\d)|(2[1-3]))(\.5)?$/; for( var i = 0 ; i <arr.length ; i++){ alert(arr[i]+" : "+pattern.test(arr[i])); }
var test = function(reg, cases){ var i, kiss, len = cases.length;
for(i = 0; i < len; i++){ kiss = cases[i]; if(!reg.test(kiss.expr) == kiss.result){ alert("用例:" + kiss.expr + "没有通过测试!"); return; } } alert('全部用例通过!'); };var reg = new RegExp( "^(" + "([0-9](?:\\.5)?)" //小于10 + "|(1[0-9](?:\\.5)?)" //小于20 + "|(24|2[0-3](?:\\.5)?)" //大于20 + ")$" );var cases = (function(){ var i, ret = []; //正确用例 for(i = 0; i<= 24; i += 0.5){ ret.push({ expr : String(i), result : true }); } //错误用例 ret = ret.concat( {expr : "0.1", result : false}, {expr : "0.2", result : false}, {expr : "10.0", result : false}, {expr : "10.1", result : false}, {expr : "24.1", result : false}, {expr : "24.5", result : false} ); return ret; })(); //执行单元测试 test(reg, cases);
有正则处理这类问题倒不是不可以,但等你过几天维护的时候就会感觉很蛋疼。 把你改不了的代码用到项目的关键路径,就等于自己找麻烦。var test = function(fn, cases){ var i, kiss, len = cases.length;
for(i = 0; i < len; i++){ kiss = cases[i]; if(!fn(kiss.expr) == kiss.result){ alert("用例:" + kiss.expr + "没有通过测试!"); return; } } alert('全部用例通过!'); }; var checker1 = (function(){ var enables = {}; for(var i = 0; i <= 24; i += 0.5){ enables[i] = null; } return function(i){ return enables.hasOwnProperty(i); }; })();var checker2 = (function(){ var reg = new RegExp( "^(" + "([0-9](?:\\.5)?)" + "|(1[0-9](?:\\.5)?)" + "|(24|2[0-3](?:\\.5)?)" + ")$" ); return function(i){ return reg.test(i); } })();var cases = (function(){ var i, ret = []; //正确用例 for(i = 0; i<= 24; i += 0.5){ ret.push({ expr : String(i), result : true }); } //错误用例 ret = ret.concat( {expr : "0.1", result : false}, {expr : "0.2", result : false}, {expr : "10.0", result : false}, {expr : "10.1", result : false}, {expr : "24.1", result : false}, {expr : "24.5", result : false} ); return ret; })(); //执行单元测试 test(checker1, cases); test(checker2, cases);
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh"> <head> <title></title> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /> <style type="text/css"> #test{width:400px;height:400px;border:solid 1px #734;overflow:auto;} span{width:180px;border:solid 1px blue;float:left;margin:1px;} </style> <script type="text/javascript"> var $ = function(id){ return document.getElementById(id);}; window.onload = function(){ var reg =/^(\d|1\d|2[0-3])(\.[05])?$|^24(\.0)?$/; for(i=0;i<100;i++) { var n = Math.random()<.3?Math.round(Math.random()*30) :((Math.random()>.3&&Math.random()<.6)?(Math.round(Math.random()*30)+[".0",".5"][Math.random()<.5?1:0]) :(Math.round(Math.random()*30)+"."+Math.round(Math.random()*16))); $("test").innerHTML =$("test").innerHTML+"<span>"+n+"</span><span>"+reg.test(n)+"</span>"; } } </script> </head> <body> <div id="test"></div> </body> </html>
/^(?!24\.5)([1-2][0-4]|\d)(\.[05])?$/.test(...)
/^(?!24\.5)(2[0-4]|1?[0-9])(\.[05])?$/.test(...)
var pattern = /^(([0-1]?\d)|(2[1-3]))(\.5)?$/;
for( var i = 0 ; i <arr.length ; i++){
alert(arr[i]+" : "+pattern.test(arr[i]));
}
var i, kiss, len = cases.length;
for(i = 0; i < len; i++){
kiss = cases[i];
if(!reg.test(kiss.expr) == kiss.result){
alert("用例:" + kiss.expr + "没有通过测试!");
return;
}
} alert('全部用例通过!');
};var reg = new RegExp(
"^("
+ "([0-9](?:\\.5)?)" //小于10
+ "|(1[0-9](?:\\.5)?)" //小于20
+ "|(24|2[0-3](?:\\.5)?)" //大于20
+ ")$"
);var cases = (function(){
var i, ret = []; //正确用例
for(i = 0; i<= 24; i += 0.5){
ret.push({
expr : String(i),
result : true
});
} //错误用例
ret = ret.concat(
{expr : "0.1", result : false},
{expr : "0.2", result : false},
{expr : "10.0", result : false},
{expr : "10.1", result : false},
{expr : "24.1", result : false},
{expr : "24.5", result : false}
); return ret;
})();
//执行单元测试
test(reg, cases);
把你改不了的代码用到项目的关键路径,就等于自己找麻烦。var test = function(fn, cases){
var i, kiss, len = cases.length;
for(i = 0; i < len; i++){
kiss = cases[i];
if(!fn(kiss.expr) == kiss.result){
alert("用例:" + kiss.expr + "没有通过测试!");
return;
}
} alert('全部用例通过!');
};
var checker1 = (function(){
var enables = {}; for(var i = 0; i <= 24; i += 0.5){
enables[i] = null;
} return function(i){
return enables.hasOwnProperty(i);
};
})();var checker2 = (function(){
var reg = new RegExp(
"^("
+ "([0-9](?:\\.5)?)"
+ "|(1[0-9](?:\\.5)?)"
+ "|(24|2[0-3](?:\\.5)?)"
+ ")$"
); return function(i){
return reg.test(i);
}
})();var cases = (function(){
var i, ret = []; //正确用例
for(i = 0; i<= 24; i += 0.5){
ret.push({
expr : String(i),
result : true
});
} //错误用例
ret = ret.concat(
{expr : "0.1", result : false},
{expr : "0.2", result : false},
{expr : "10.0", result : false},
{expr : "10.1", result : false},
{expr : "24.1", result : false},
{expr : "24.5", result : false}
); return ret;
})();
//执行单元测试
test(checker1, cases);
test(checker2, cases);
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<style type="text/css">
#test{width:400px;height:400px;border:solid 1px #734;overflow:auto;}
span{width:180px;border:solid 1px blue;float:left;margin:1px;}
</style>
<script type="text/javascript">
var $ = function(id){ return document.getElementById(id);};
window.onload = function(){
var reg =/^(\d|1\d|2[0-3])(\.[05])?$|^24(\.0)?$/;
for(i=0;i<100;i++)
{
var n = Math.random()<.3?Math.round(Math.random()*30)
:((Math.random()>.3&&Math.random()<.6)?(Math.round(Math.random()*30)+[".0",".5"][Math.random()<.5?1:0])
:(Math.round(Math.random()*30)+"."+Math.round(Math.random()*16)));
$("test").innerHTML =$("test").innerHTML+"<span>"+n+"</span><span>"+reg.test(n)+"</span>";
}
}
</script>
</head>
<body>
<div id="test"></div>
</body>
</html>
s = s.match(/^(1?[0-9]|2[0-4])(\.[05])?$/);
console.log(s == null ? "false" : "true");