¿Por qué coincidir encontrar un resultado mientras que la prueba devuelve false para una expresión regular en JavaScript?
-
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
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