[英]JavaScript Regular Expression digits not matching string containing single zero
我正在使用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".match(/\\d*$/)
返回数组["0"]
,在比较中将其转换为字符串表示形式"0"
。
编辑:好的,字符串不是“ falsy”。 仍然有一些正在进行的转换,最终导致"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 "";
}
}
看到一个演示 。
好吧,哇...真奇怪。 实际发生了什么:
.match的结果是一个数组。 由于您只有一个匹配项,因此结果为['0']和['0']。toString()==='0'== false。
在任何其他情况下(如果您匹配了正则表达式中设置的括号),则无论它是否为零,都将不等于false。
现在,奇怪的是:
> ['0'] == false
true
> !!['0']
true
因此,==运算符会强制使用一个隐式.toString(),其中! 操作员没有!
0 == false
在javascript中返回true。 0 === false
将在javascript中返回false。
在val.match(/\\d*$/) == false
中更改您的val.match(/\\d*$/) == false
val.match(/\\d*$/) === false
。 我不知道这是否可以解决您的问题,但是牢记这一点总是很好的。
尝试这个:-
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;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.