Perché sarebbe partita trovare un risultato, mentre test restituisce false per un'espressione regolare in JavaScript?

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

  •  22-08-2019
  •  | 
  •  

Domanda

Stavo cercando di eseguire il debug di un problema di ordinamento con il plugin jQuery tablesorter , che utilizza il seguente codice per verificare la presenza di cifre:

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));
            };

il valore per config.decimal è ''

Ora, se s = '0' questo non riesce, ma se si esegue partita invece l'espressione regolare sembra essere rispondere positivamente come previsto.

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

Come è questa elaborazione in modo diverso al fine di restituire risultati diversi?

Nel caso in cui si voleva il codice HTML dove s è derivato (L'ultima colonna è visto come testo):

<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>

Capisco che prova restituisce un valore booleano and match restituisce una stringa o nullo.

La domanda finale è il motivo per cui non è per questa espressione regolare:

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

equivalente a:

return exp.match($.trim(s)) != null
È stato utile?

Soluzione

Credo che sia un po 'di una strana coincidenza a causa della funzione utilizzata per costruire l'espressione regolare.

Match è un membro della stringa.

Test è un membro del RegExp.

Tuttavia, nella funzione lì, exp è definito come una stringa. Quindi, tecnicamente, si sta eseguendo la partita di String () utilizzando exp come valore stringa, non come un'espressione regolare.

Esecuzione di exp attraverso un costruttore RegExp deve restituire lo stesso risultato di test () sarebbe.

Altri suggerimenti

partita rendimenti matrice di valori, test restituisce booleano, su alcuni test di motore ritorna primo risultato

Si scopre che si tratta di un capovolgimento degli oggetti appropriati.

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

dovrebbe essere

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

Il codice originale è stato solo controllando che "0" esisteva nella stringa RegEx

sembra ancora essere un bug in tablesorter. È necessario dichiarare il parser come 'cifra' se 0 i valori sono presenti nella tabella. JQuery problema tablesorter

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top