我正在使用JavaScript正则表达式:
val.match(/\d*$/)
当字符串为“0”时,它对所有数字的预期工作。单个零值不匹配。我该如何加入?
测试用例:
<html>
<head>
<script src="scripts/jquery-1.5.1.min.js" type="text/javascript"></script>
</head>
<body>
<input type="text" id="txtRange" />
<div id="result" />
<script type="text/javascript">
var rangeValidate = function (val, min, max) {
if (val == "") {
return "You must specify a number between " + min + " and " + max;
} else if (val.match(/\d*$/) == false) {
return "You must specify a number between " + min + " and " + max;
} else if ((val < min) || (val > max)) {
return "You must specify a number between " + min + " and " + max;
} else {
return "";
}
return "You must specify a number between " + min + " and " + max;
}
$('#txtRange').bind('change', function(){
var value = $('#txtRange').val();
var resultText = rangeValidate(value, 0, 8);
$('#result').html(resultText);
});
</script>
</body>
</html>
答案 0 :(得分:4)
匹配,"0".match(/\d*$/)
返回数组["0"]
,当用于比较时将其转换为其字符串表示形式"0"
。
编辑:好的,字符串不是“麻痹”。尽管如此,还是有一些转换最终会导致"0" == false
评估为true
。
你应该使用.test()
[docs](总是返回一个布尔值)代替和/或严格相等===
:
} else if (/\d*$/.test(val) === false) {
如果整个字符串应该是数字,您还应该将表达式锚定在字符串的开头:
/^\d*$/
或者根本不使用正则表达式并使用+
将值转换为数字。如果它无法转换(因为它包含除数字之外的其他内容),它将返回特殊值NaN
(不是数字)。你的代码将成为:
var rangeValidate = function (val, min, max) {
val = +val;
if (isNaN(val) || (val < min) || (val > max)) {
return "You must specify a number between " + min + " and " + max;
} else {
return "";
}
}
查看DEMO。
答案 1 :(得分:1)
好的,哇......很奇怪。实际发生了什么:
.match的结果是一个数组。由于你只有一个匹配,你的结果是['0']和['0']。toString()==='0'== false。
在任何其他情况下(如果你匹配正则表达式中的paren设置等),无论是否为零,这都不等于false。
现在为了奇怪的一点:
> ['0'] == false
true
> !!['0']
true
所以==运算符强制一个隐含的.toString()作为!运营商没有!
答案 2 :(得分:1)
0 == false
在javascript中返回true。
0 === false
将在javascript中返回false。
更改val.match(/\d*$/) == false
中的val.match(/\d*$/) === false
。我不知道这是否能解决你的问题,但记住这一点总是好的。
答案 3 :(得分:0)
试试这个: -
var rangeValidate = function (val, min, max) {
if ( /^\d+$/.test(val) && val>=min && val<=max ) {
return "";
} else {
return "You must specify a number between " + min + " and " + max;
}
}