JavaScript正则表达式数字不匹配包含单个零的字符串

时间:2011-03-23 18:37:55

标签: javascript jquery regex

我正在使用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>

4 个答案:

答案 0 :(得分:4)

匹配,"0".match(/\d*$/)返回数组["0"],当用于比较时将其转换为其字符串表示形式"0"

<德尔> 但是在JavaScript中,字符串“”0“`是”falsy“,这意味着它在布尔上下文中计算为”false“。

编辑:好的,字符串不是“麻痹”。尽管如此,还是有一些转换最终会导致"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;
    }
}