it-swarm.com.de

regex.test V.S. string.match, um festzustellen, ob ein String einem regulären Ausdruck entspricht

Oft benutze ich die Funktion string match, um festzustellen, ob ein String mit einem regulären Ausdruck übereinstimmt.

if(str.match(/{regex}/))

Gibt es einen Unterschied zwischen:

if (/{regex}/.test(str))

Sie scheinen das gleiche Ergebnis zu liefern?

263
gdoron

Grundsätzliche Verwendung

Schauen wir uns zunächst an, was die einzelnen Funktionen bewirken:

regexObject. test ( String)

Führt die Suche nach einer Übereinstimmung zwischen einem regulären Ausdruck und einer angegebenen Zeichenfolge aus. Gibt true oder false zurück.

string. match ( RegExp)

Wird verwendet, um Übereinstimmungen abzurufen, wenn eine Zeichenfolge mit einem regulären Ausdruck abgeglichen wird. Gibt ein Array mit den Übereinstimmungen oder null zurück, wenn keine vorhanden sind.

Da null zu false ausgewertet wird,

if ( string.match(regex) ) {
  // There was a match.
} else {
  // No match.
} 

Performance

Gibt es Leistungsunterschiede?

Ja . Ich fand diese kurze Notiz in der MDN-Site :

Wenn Sie wissen möchten, ob eine Zeichenfolge mit einem regulären Ausdruck "regexp" übereinstimmt, verwenden Sie "regexp.test" (Zeichenfolge).

Ist der Unterschied signifikant?

Die Antwort lautet noch einmal [~ # ~] yes [~ # ~] ! Dieses jsPerf , das ich zusammengestellt habe, zeigt, dass der Unterschied je nach Browser ~ 30% - ~ 60% beträgt:

test vs match | Performance Test

Fazit

Verwenden .test wenn Sie eine schnellere boolesche Prüfung wünschen. Verwenden .match, um alle Übereinstimmungen abzurufen, wenn das globale Flag g verwendet wird.

408
gdoron

Vergessen Sie nicht, die globale Flagge in Ihrem regulären Ausdruck zu berücksichtigen:

var reg = /abc/g;
!!'abcdefghi'.match(reg); // => true
!!'abcdefghi'.match(reg); // => true
reg.test('abcdefghi');    // => true
reg.test('abcdefghi');    // => false <=

Dies liegt daran, dass Regexp den lastIndex nachverfolgt, wenn eine neue Übereinstimmung gefunden wird.

97
gtournie