Por que iria corresponder encontrar um resultado enquanto o teste retorna false para uma expressão regular em JavaScript?
-
22-08-2019 - |
Pergunta
Eu estava tentando depurar um problema de classificação com o plugin jQuery tablesorter que utiliza o seguinte código para verificar dígitos:
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));
};
o valor para config.decimal é ''
Agora, se s = '0' isto falhar, mas se você executar corresponder ao invés do RegEx parece estar respondendo positivamente como esperado.
return exp.match($.trim(s)) != null
Como é esse processamento de forma diferente, a fim de retornar resultados diferentes?
Apenas no caso você queria que o HTML, onde s é derivado (A última coluna é visto como texto):
<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>
Eu entendo que o teste retorna um valor booleano e combinar retorna uma string ou nulo.
A pergunta final é por isso que não é para esta expressão regular:
return RegExp(exp).test($.trim(s));
equivalente a:
return exp.match($.trim(s)) != null
Solução
Eu acho que é um pouco de uma estranha coincidência devido à função usado para construir a expressão regular.
Match é um membro da cadeia.
Test é membro de RegExp.
No entanto, na função lá, exp é definido como uma string. Então, tecnicamente, você está executando o jogo de String () usando exp como um valor da cadeia, não como uma expressão regular.
Running exp através de um construtor RegExp deve retornar o mesmo resultado que test () faria.
Outras dicas
jogo retornos matriz de valores, teste retorna boolean, em algum ensaio de motores retornos primeiro resultado
Acontece que é uma inversão dos objetos apropriados.
return exp.match($.trim(s)) != null
deve ser
return $.trim(s).match(exp) != null
O código original estava apenas verificando que "0" existia na cadeia de RegEx
Ainda parece ser um bug no tablesorter. Você tem que declarar o analisador como 'dígitos' Se 0 valores estão presentes em sua mesa. JQuery tablesorter problema