簡體   English   中英

JavaScript正則表達式數字與包含單個零的字符串不匹配

[英]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"

但是在JavaScript中,字符串“ 0”是“ falsy”,這意味着它在布爾上下文中的值為false。

編輯:好的,字符串不是“ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM