2009-05-19 67 views
0

我试图调试一个排序问题与jQuery插件的tablesorter它使用下面的代码来检查数字:为什么会匹配找到一个结果,而测试在JavaScript中为正则表达式返回false?

this.isDigit = function(s,config) { 
       var DECIMAL = '\\' + config.decimal; 
       var exp = '/(^[+]?0(' + DECIMAL +'0+)?$)|(^([-+]?[1-9][0-9]*)$)|(^([-+]?((0?|[1-9][0-9]*)' + DECIMAL +'(0*[1-9][0-9]*)))$)|(^[-+]?[1-9]+[0-9]*' + DECIMAL +'0+$)/'; 
       return RegExp(exp).test($.trim(s)); 
      }; 

为config.decimal值“”

现在,如果s ='0',则失败,但如果您运行匹配,则RegEx会按预期正向响应。

return exp.match($.trim(s)) != null 

为了返回不同的结果,这种处理方式有什么不同?

万一你想其中S是导出(最后一栏被视为文本)的HTML:

<tr class=""> 
    <td><a href="#">Click</a></td> 
    <td>Annen Woods</td> 
    <td>131</td> 
    <td>20</td>   
    <td>5</td> 
    <td>3</td> 
    <td>12</td> 
    <td>6</td> 
    <td>50%</td> 
    <td>0</td>  
</tr> 

据我所知,测试返回一个布尔值和匹配返回一个字符串或空。

最终的问题是为什么不是此正则表达式:

return RegExp(exp).test($.trim(s)); 

等效于:

return exp.match($.trim(s)) != null 

回答

1

我觉得这有点奇怪的巧合,因为用来构造正则表达式的函数。

Match是String的成员。

测试是RegExp的成员。

但是,在那里的函数中,exp被定义为一个字符串。因此,从技术上讲,您使用exp作为字符串值运行String的match(),而不是正则表达式。

通过RegExp构造函数运行exp应该返回与test()相同的结果。

1

匹配返回值的阵列,测试返回布尔值,在某些发动机测试返回第一结果

+0

好的,但为什么当匹配似乎工作时测试不会返回true? – catalpa 2009-05-19 16:03:39

0

原来,这是相应对象的逆转。

return exp.match($.trim(s)) != null 

应该

return $.trim(s).match(exp) != null 

原代码只是检查“0”的正则表达式字符串

似乎仍然是一个的tablesorter存在错误。如果表中存在0值,则必须将解析器声明为“数字”。 JQuery tablesorter problem

相关问题