Molte volte sto usando la match
funzione stringa per sapere se una stringa corrisponde a un'espressione regolare.
if(str.match(/{regex}/))
C'è qualche differenza tra questo:
if (/{regex}/.test(str))
Sembrano dare lo stesso risultato?
Molte volte sto usando la match
funzione stringa per sapere se una stringa corrisponde a un'espressione regolare.
if(str.match(/{regex}/))
C'è qualche differenza tra questo:
if (/{regex}/.test(str))
Sembrano dare lo stesso risultato?
Risposte:
Innanzitutto, vediamo cosa fa ogni funzione:
regexObject . test ( stringa )
Esegue la ricerca di una corrispondenza tra un'espressione regolare e una stringa specificata. Restituisce vero o falso .
stringa . match ( RegExp )
Utilizzato per recuperare le corrispondenze quando si confronta una stringa con un'espressione regolare. Restituisce un array con le corrispondenze o
null
se non ce ne sono.
Poiché null
valuta false
,
if ( string.match(regex) ) {
// There was a match.
} else {
// No match.
}
C'è qualche differenza riguardo alle prestazioni?
Sì . Ho trovato questa breve nota nel sito MDN :
Se devi sapere se una stringa corrisponde a un'espressione regolare regexp, usa regexp.test (stringa).
La differenza è significativa?
La risposta è di nuovo SÌ ! Questo jsPerf che ho messo insieme mostra che la differenza è ~ 30% - ~ 60% a seconda del browser:
Utilizzare .test
se si desidera un controllo booleano più veloce. Utilizzare .match
per recuperare tutte le partite quando si utilizza la g
bandiera globale.
.test()
. :)
Non dimenticare di prendere in considerazione la bandiera globale nel tuo regexp:
var reg = /abc/g;
!!'abcdefghi'.match(reg); // => true
!!'abcdefghi'.match(reg); // => true
reg.test('abcdefghi'); // => true
reg.test('abcdefghi'); // => false <=
Questo perché Regexp tiene traccia di lastIndex quando viene trovata una nuova corrispondenza.
.test()
? non è il punto di .test()
verificare se la stringa ha una regexp corrispondente?
Questo è il mio risultato di riferimento
test 4.267.740 ops / sec ± 1,32% (60 serie campionate)
exec 3.649.719 ops / sec ± 2,51% (60 serie campionate)
corrispondenza 3,623,125 op / sec ± 1,85% (62 serie campionate)
indice di 6.230.325 op / sec ± 0,95% (62 serie campionate)
il metodo di test è più veloce del metodo di corrispondenza, ma il metodo più veloce è indexOf