regex.test VS string.match, bir dizenin normal ifadeyle eşleşip eşleşmediğini bilmek için


287

Çoğu zaman matchbir dizenin normal bir ifade ile eşleşip eşleşmediğini bilmek için string işlevini kullanıyorum .

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

Bunlar arasında herhangi bir fark var mı:

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

Aynı sonucu veriyorlar mı?



@ ajax333221. Jsperf için teşekkürler, ama iyi bir şey olduğundan emin değilim. Normal ifade, bir boole değeri ararken gerekli olmayan bir eşleşme grubu kullanarak eşleşir.
gdoron Monica

Yanıtlar:


440

Temel Kullanım

İlk olarak, her bir işlevin ne yaptığını görelim:

regexObject . test ( Dize )

Normal bir ifade ile belirtilen bir dize arasındaki eşleşmeyi arar. Doğru veya yanlış döndürür .

dize . eşleşme ( RegExp )

Bir dizeyi normal ifadeyle eşleştirirken eşleşmeleri almak için kullanılır. Eşleşmeleri olan veya nullyoksa bir dizi döndürür .

Yana nullolarak değerlendirilirse false,

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

Verim

Performansla ilgili bir fark var mı?

Evet . Bu kısa notu MDN sitesinde buldum :

Bir dizenin normal ifade regexp'si ile eşleşip eşleşmediğini bilmeniz gerekiyorsa regexp.test (string) kullanın.

Fark önemli mi?

Cevap bir kez daha EVET ! Bu jsPerf I fark gösterir araya ~% 60 - yaklaşık% 30 : tarayıcı bağlı olarak

testi vs maçı |  Performans testi

Sonuç

.testDaha hızlı bir boole kontrolü istiyorsanız kullanın . Genel bayrağı .matchkullanırken tüm eşleşmeleri almak için kullanın g.


5
Dize işlevinin bir şeyleri ters çevirmesi ve ardından bir eşleşme varsa Array'ı oluşturması gerektiğinden çok şaşırmadım. Kullanmaya devam edeceğim gibi görünüyor .test(). :)

22
İki sentim: performans abartılıyor. Her iki seçenek de bir monitörün titremesinde ~ 15.000 işlem yapabilir, bu nedenle toplu regex istemci tarafında değilseniz, hız ilgili değildir. Elbette 'test' mantıksal olarak doğru işlevdir, eğer bir boole sonucu peşindeyseniz. Q / A BTW için teşekkürler.
David Gilbertson

2
İlginçtir ki yukarıdaki jsPerf testi (Chrome 41, OSX) kullanılarak test benim için% 41 daha yavaş.
Benjie

1
@AlexShilman indexOf, bu stackoverflow.com/questions/183496/… 'a göre testten daha hızlıdır (ancak çok fazla değildir) (daha hızlı olmasını beklersiniz).
podperson

1
Sizi burada ısırabilecek bir şey var (yakın zamanda ekibimi ısırdı): Regex'inizdeki 'g' bayrağını kullanır ve yeni bir örnek oluşturursanız (yani yeni RegExp (<regex_str>, 'g') aracılığıyla) ve yeniden kullanırsanız Örneğin, "test" çalıştırmak durumsaldır, yani birden çok kez çalıştırıldığında farklı sonuçlar döndürür. Ayrıntılar için developer.mozilla.org/tr-TR/docs/Web/JavaScript/Reference/… adresine bakın.
davertron

118

Normal ifadenizdeki global bayrağı dikkate almayı unutmayın:

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

Bunun nedeni, Regexp'in yeni bir eşleşme bulunduğunda lastIndex'in kaydını tutmasıdır.


21
Ben sadece benim regex.test () rastgele "doğru" sonra "yanlış" sonra "doğru" günlüğü gördüm görmek vurarak baş oldu ... teşekkürler!
adriendenat

7
Bence bu daha iyi bir yanıt. Aynı sonucu vermediklerini ve reg.test () 'in tehlikeli bir tuzağa sahip olduğunu açıklar. Bana göre bu string.match () 'i açık seçim yapıyor. Performans benim için hiç sorun olmamıştı.
James

2
Bu önemli! Diğer sonuçların neden eksik olduğunu anlamaya çalışırken çıldırmak ... Bunu bulan başka bir kişinin referansı için: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Dan

2
Benim kadar kafam karıştıysa, bkz. Stackoverflow.com/q/1520800/3714913 . Ayrıca bir dizin döndüren ancak anlayabildiğim kadarıyla bu sorunu olmayan String.prototype.search () vardır .
Nateowami

3
Sadece merak ediyorum, küresel bir bayrağa sahip olmanın anlamı .test()nedir? .test()dizenin eşleşen bir normal ifade olup olmadığını kontrol etmek değil mi?
buhbang

0

Bu benim kıyaslama sonuçlarım karşılaştırma sonuçları

test 4.267.740 ops / sn ±% 1.32 (60 çalışma örneklenmiş)

yürütme 3,649,719 ops / sn ±% 2,51 (60 çalışma örneklenmiş)

maç 3,623,125 ops / sn ± 1,85% (62 örneklenmiş örnek)

endeks 6.230.325 ops / sn ±% 0.95 (62 örneklenmiş çalışma)

test yöntemi eşleme yönteminden daha hızlıdır, ancak en hızlı yöntem indexOf


indexOf, normal olmayan regex'lerle çalışmaz.
gdoron Monica
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.