2012-08-13 62 views

回答

1

这是在默认情况下使用ASP.NET MVC进来jquery.validate.jsjquery.validate.min.js文件数量正则表达式中的错误3.

下面是从jquery.validate.js代码,行1048:

// http://docs.jquery.com/Plugins/Validation/Methods/number 
number: function(value, element) { 
    return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(value); 
} 

这函数对数字正则表达式进行字符串测试。要修复它,请用以下代码替换正则表达式:/^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/

这是一个简短的版本。现在,这里的解释是:

巴吉^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$正则表达式读作:

^-? 
    Beginning of line or string 
    -, zero or one repetitions 
Match expression but don't capture it. [\d+|\d{1,3}(?:,\d{3})+] 
    Select from 2 alternatives 
     Any digit, one or more repetitions 
     \d{1,3}(?:,\d{3})+ 
      Any digit, between 1 and 3 repetitions 
      Match expression but don't capture it. [,\d{3}], one or more repetitions 
       ,\d{3} 
        , 
        Any digit, exactly 3 repetitions 
Match expression but don't capture it. [\.\d+], zero or one repetitions 
    \.\d+ 
     Literal . 
     Any digit, one or more repetitions 
End of line or string 

正如你所看到的,第二个捕获组(?:\.\d+)?允许号码.XX格式,但匹配时,第一组(?:\d+|\d{1,3}(?:,\d{3})+)首先检查和验证失败因为第一组必须与匹配。

如果我们要参考http://docs.jquery.com/Plugins/Validation/Methods/number演示并检查它们的数字验证的正则表达式,它将如下所示:^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$。这与越野车相同,但现在第一匹配组应该是zero or one repetitions换句话说可选的。这个额外的?正则表达式修正了错误。

编辑:这也适用于MVC 4默认模板。这两个模板都使用1.9.0版本的插件。在版本1.10.0中,此问题已修复。 From changelog

  • 修复了不带前导零的小数的正则表达式问题。增加了新的方法测试。修复#41

所以有时候保持更新是一个好主意。