regex.test VS string.match per sapere se una stringa corrisponde a un’espressione regolare

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?

Uso di base

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

Prestazione

C’è qualche differenza in termini di prestazioni?

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 è ! Questo jsPerf che ho messo insieme mostra che la differenza è ~ 30% – ~ 60% a seconda del browser:

test vs match | Test della prestazione

Conclusione

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.