Molte volte sto usando la funzione di confronto delle stringhe 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?
Per prima cosa, vediamo cosa fa ciascuna funzione:
regexObject . test ( stringa )
Esegue la ricerca di una corrispondenza tra un’espressione regolare e una stringa specificata. Restituisce vero o falso .
stringa . corrispondenza ( RegExp )
Utilizzato per recuperare le corrispondenze quando si confronta una stringa con un’espressione regolare. Restituisce una matrice con le corrispondenze o
null
se non ce ne sono.
Poiché null
false
,
if ( string.match(regex) ) { // There was a match. } else { // No match. }
C’è qualche differenza in termini di prestazioni?
Sì Ho trovato questa breve nota nel sito MDN :
Se hai bisogno di sapere se una stringa corrisponde a un’espressione regolare, inserisci regexp.test (stringa).
La differenza è significativa?
La risposta ancora una volta è SÌ ! Questo jsPerf che ho messo insieme mostra che la differenza è ~ 30% – ~ 60% a seconda del browser:
Usa. .test
se vuoi un controllo booleano più veloce. Usa .match
per recuperare tutte le corrispondenze quando si usa il flag g
globale.
Non dimenticare di prendere in considerazione la bandiera globale nella tua espressione regolare:
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.