Por que iria corresponder encontrar um resultado enquanto o teste retorna false para uma expressão regular em JavaScript?

StackOverflow https://stackoverflow.com/questions/883625

  •  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
Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top