¿Por qué coincidir encontrar un resultado mientras que la prueba devuelve false para una expresión regular en JavaScript?

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

  •  22-08-2019
  •  | 
  •  

Pregunta

Yo estaba tratando de depurar un problema de clasificación con el plugin jQuery tablesorter que utiliza el código siguiente para comprobar si hay 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));
            };

el valor de config.decimal es ''.

Ahora bien, si s = '0' esto no funciona, pero si se ejecuta partido vez la expresión regular parece estar respondiendo positivamente como se esperaba.

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

¿Cómo es diferente este procesamiento con el fin de devolver resultados diferentes?

En caso de que quería que el HTML, donde s se deriva (La última columna es 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>

Yo entiendo que prueba devuelve un valor booleano y combinar devuelve una cadena o nula.

La última pregunta es ¿por qué no es por esta expresión regular:

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

equivalente a:

return exp.match($.trim(s)) != null
¿Fue útil?

Solución

Creo que es un poco de una extraña coincidencia debido a la función que se utiliza para la construcción de la expresión regular.

Match es un miembro de la cadena.

Prueba es miembro de RegExp.

Sin embargo, en la función de ahí, exp se define como una cadena. Así que, técnicamente, se está ejecutando el partido del String () exp usando como un valor de cadena, no como una expresión regular.

Running exp través de un constructor RegExp debe devolver el mismo resultado que el test () sería.

Otros consejos

retornos de los partidos matriz de valores, prueba devuelve boolean, en alguna prueba de motor devuelve primer resultado

Resulta que es una inversión de los objetos apropiados.

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

debería ser

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

El código original se acaba de comprobar que "0" existía en la cadena de expresiones regulares

Todavía parece ser un error en tablesorter. Usted tiene que declarar el analizador como 'dígito' 0 si los valores están presentes en su mesa. jQuery problema tablesorter

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top