2011-03-23 128 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; 
    } 
} 
相关问题