2011-03-23 21 views
1

我使用JavaScript的正則表達式字符串: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".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 ""; 
    } 
} 

看到一個DEMO

+0

@Felix King - 在JavaScript中,字符串「0」肯定是**不是**「falsy」。這是一個非空字符串,因此它是「真實的」。 – Pointy 2011-03-23 19:01:28

+0

@Pointy:至少在Chrome控制檯中,輸入「」0「== false」會給我「真」。我應該如何理解?我看到......還有一些轉換正在進行中。 – 2011-03-23 19:02:37

+0

嘗試'!!「0」'而不是'if(「0」)alert('falsy');' – Pointy 2011-03-23 19:03:54

1

好了,哇......只是奇怪。實際上發生了什麼:

.match的結果是一個數組。既然你有一個匹配,你的結果是['0']和['0']。toString()==='0'== false。

在任何其他情況下(如果您在正則表達式中匹配paren集合等),不管它是否爲零,這都不會等於false。

現在的怪異位:

> ['0'] == false 
true 
> !!['0'] 
true 

所以==操作符迫使一個隱含的ToString(),其中爲!操作員不!

1

0 == false在javascript中返回true。 0 === false將在javascript中返回false。

將您的val.match(/\d*$/) == false更改爲val.match(/\d*$/) === false。我不知道這是否能解決您的問題,但記住這一點總是很好的。

+1

它其實沒有,僅供參考。因爲.match的結果是一個數組,所以'=== false'將總是假的。和'[] === false'永遠不會匹配。但顯然,'=='有一個隱含的'.toString()' – 2011-03-23 19:00:23

+0

不錯的一個,忘記了數組謝謝 – rsplak 2011-03-23 20:48:36

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; 
    } 
} 
相關問題