regex.test VS string.matchは、文字列が正規表現に一致するかどうかを確認します


287

多くのmatch場合、文字列関数を使用して、文字列が正規表現に一致するかどうかを確認しています。

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

これには違いがありますか?

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

彼らは同じ結果を与えるようですか?


4
これらは、jsperf.com / regexp
test

@ ajax333221。jsperfに感謝しますが、それが良いものかどうかはわかりません。ブール値を検索する場合は不要な一致グループを使用した正規表現一致。
gdoronがモニカをサポートしている

回答:


440

基本的な使い方

まず、各関数の機能を見てみましょう。

regexObjectテスト文字列

正規表現と指定された文字列の一致を検索します。trueまたはfalseを返します。

文字列一致RegExp

文字列を正規表現と照合するときに一致を取得するために使用されます。一致した配列、または一致nullがない場合は配列を返します。

はにnull評価されるのでfalse

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

パフォーマンス

パフォーマンスに関して違いはありますか?

はいMDNサイトでこの短いメモを見つけました。

文字列が正規表現regexpと一致するかどうかを知る必要がある場合は、regexp.test(string)を使用します。

違いは重要ですか?

答えはもう一度YESです!私がまとめたこのjsPerfは、ブラウザによっては〜30%-〜60 %の違いがあることを示しています 。

テストvsマッチ|  性能試験

結論

.testより高速なブール値チェックが必要な場合に使用します。グローバルフラグ.matchを使用するときに、すべての一致を取得するために使用しますg


5
文字列関数は物事をひっくり返して、一致がある場合は配列を作成する必要があるため、それほど驚くことではありません。使い続けるようです.test()。:)

22
私の2セント:パフォーマンスは過大評価されています。どちらのオプションでも、モニターのちらつきで最大15,000の操作を実行できるため、クライアント側で一括正規表現を実行している場合を除き、速度は重要ではありません。もちろん、ブール結果があなたが求めているものである場合、「テスト」は論理的に正しい関数です。Q / A BTWをありがとう。
David Gilbertson、2013年

2
興味深いことに、上記のjsPerfテスト(Chrome 41、OSX)を使用した場合よりもテストが41%遅くなっています。
Benjie

1
@AlexShilman indexOfは、このstackoverflow.com/questions/183496/…に従ってテストするよりも高速です(多くはありません)(高速であることが期待されます)。
ポッドパーソン、2016

1
ここであなたに噛みつくかもしれないことの1つ(最近、私のチームに噛みついた):Regexで 'g'フラグを使用して新しいインスタンスを作成し(つまり、新しいRegExp(<regex_str>、 'g')を使用)、それを再利用する場合たとえば、「test」の実行はステートフルです。つまり、複数回実行すると異なる結果が返されます。詳細については、developer.mozilla.org / en-US / docs / Web / JavaScript / Reference / を参照てください。
davertron

118

正規表現のグローバルフラグを考慮することを忘れないでください。

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

これは、新しい一致が見つかったときにRegexpがlastIndexを追跡するためです。


21
regex.test()が「true」、「false」、「true」の順にランダムにログを記録しているのを見て頭を叩きました...ありがとう!
adriendenat 14

7
これがより良い答えだと思います。それはそれらが同じ結果を与えないこと、そしてreg.test()が危険な落とし穴を持っていることを説明しています。私にとって、これはstring.match()を明確な選択にします。私にとってパフォーマンスは決して問題ではありませんでした。
ジェームズ

2
これは重要!誰の参考のために...他のすべての結果が欠落していた理由を理解しようとクレイジー行くことを発見し、この:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
ダン・

2
私と同じように混乱している場合は、stackoverflow.com / q / 1520800/3714913を参照してください。String.prototype.search()もあり、インデックスを返しますが、私が知る限りこの問題はありません。
Nateowami

3
気になるのは、グローバルフラグを設定する意味は何.test()ですか。.test()文字列に一致する正規表現があるかどうかを確認するポイントはありませんか?
buhbang '20

0

これは私のベンチマーク結果です ベンチマーク結果

テスト4,267,740 ops / sec±1.32%(60回の実行をサンプリング)

exec 3,649,719 ops / sec±2.51%(60回の実行をサンプリング)

3,623,125演算/秒に一致±1.85%(62ランのサンプル)

indexOf 6,230,325 ops / sec±0.95%(62ランのサンプル)

testメソッドはmatchメソッドより高速ですが、最も高速なメソッドはindexOfです。


indexOfは正規表現では機能しないため、あまり関係ありません。
gdoronは
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.