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

votos
0

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 jogo em vez 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
Publicado 19/05/2009 em 17:00
fonte usuário
Em outras línguas...                            


3 respostas

votos
1

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.

Teste é um 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.

Correndo exp através de um construtor RegExp deve retornar o mesmo resultado que test () iria.

Respondeu 19/05/2009 em 18:56
fonte usuário

votos
1

match retorna matriz de valores, teste retorna boolean, em algum teste do motor retorna primeiro resultado

Respondeu 19/05/2009 em 17:01
fonte usuário

votos
0

Acontece que ele é uma inversão dos objetos apropriados.

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

deveria estar

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. Problema tablesorter JQuery

Respondeu 20/05/2009 em 14:39
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more