Bu benim eski bir yazım, kabul edilen cevaplar çoğunlukla iyi. Bununla birlikte, her çözümü ve başka bir açık çözümü (sadece eğlence için) karşılaştırmaya karar verdim. Farklı boyutlu dizelere sahip farklı tarayıcılardaki normal ifade kalıpları arasında bir fark olup olmadığını merak ettim.
Yani temelde kullandım jsPerf üzerinde
- Chrome 65.0.3325 / Windows 10 0.0.0'da test ediliyor
- Edge 16.16299.0 / Windows 10 0.0.0'da test etme
Test ettiğim normal ifade kalıpları
/[\W_]+/g
/[^a-z0-9]+/gi
/[^a-zA-Z0-9]+/g
Onları dize uzunluğunda rastgele karakterlerle yükledim
- uzunluk 5000
- uzunluk 1000
- uzunluk 200
Kullandığım örnek javascript var newstr = str.replace(/[\W_]+/g," ");
Her çalışma, her normal ifadede 50 veya daha fazla örnekten oluşuyordu ve bunları her tarayıcıda 5 kez çalıştırıyorum.
Atlarımızı yarıştıralım!
Sonuçlar
Chrome Edge
Chars Pattern Ops/Sec Deviation Op/Sec Deviation
------------------------------------------------------------------------
5,000 /[\W_]+/g 19,977.80 1.09 10,820.40 1.32
5,000 /[^a-z0-9]+/gi 19,901.60 1.49 10,902.00 1.20
5,000 /[^a-zA-Z0-9]+/g 19,559.40 1.96 10,916.80 1.13
------------------------------------------------------------------------
1,000 /[\W_]+/g 96,239.00 1.65 52,358.80 1.41
1,000 /[^a-z0-9]+/gi 97,584.40 1.18 52,105.00 1.60
1,000 /[^a-zA-Z0-9]+/g 96,965.80 1.10 51,864.60 1.76
------------------------------------------------------------------------
200 /[\W_]+/g 480,318.60 1.70 261,030.40 1.80
200 /[^a-z0-9]+/gi 476,177.80 2.01 261,751.60 1.96
200 /[^a-zA-Z0-9]+/g 486,423.00 0.80 258,774.20 2.15
Gerçek şu ki, her iki tarayıcıdaki Regex (sapmayı dikkate alarak) neredeyse ayırt edilemezdi, ancak bence bunu daha fazla çalıştırırsa sonuçlar biraz daha netleşir (ama çok değil).
1 karakter için teorik ölçeklendirme
Chrome Edge
Chars Pattern Ops/Sec Scaled Op/Sec Scaled
------------------------------------------------------------------------
5,000 /[\W_]+/g 19,977.80 99,889,000 10,820.40 54,102,000
5,000 /[^a-z0-9]+/gi 19,901.60 99,508,000 10,902.00 54,510,000
5,000 /[^a-zA-Z0-9]+/g 19,559.40 97,797,000 10,916.80 54,584,000
------------------------------------------------------------------------
1,000 /[\W_]+/g 96,239.00 96,239,000 52,358.80 52,358,800
1,000 /[^a-z0-9]+/gi 97,584.40 97,584,400 52,105.00 52,105,000
1,000 /[^a-zA-Z0-9]+/g 96,965.80 96,965,800 51,864.60 51,864,600
------------------------------------------------------------------------
200 /[\W_]+/g 480,318.60 96,063,720 261,030.40 52,206,080
200 /[^a-z0-9]+/gi 476,177.80 95,235,560 261,751.60 52,350,320
200 /[^a-zA-Z0-9]+/g 486,423.00 97,284,600 258,774.20 51,754,840
Bu gerçekten önemli bir fark olmadığı için bu sonuçlara çok fazla değinmem, gerçekten söyleyebileceğimiz tek şey sınırın daha yavaş olduğu: o. Ayrıca çok sıkıldım.
Her neyse, kendi kendinize kıyaslama yapabilirsiniz.
Jsperf Benchmark burada