นี่เป็นโพสต์เก่าของฉันคำตอบที่ได้รับการยอมรับนั้นดีสำหรับส่วนใหญ่ อย่างไรก็ตามฉันตัดสินใจที่จะเปรียบเทียบแต่ละโซลูชันและอีกวิธีหนึ่งที่ชัดเจน (เพื่อความสนุกสนาน) ฉันสงสัยว่ามีความแตกต่างระหว่างรูปแบบ regex ในเบราว์เซอร์ต่าง ๆ ที่มีสตริงขนาดต่างกันหรือไม่
โดยพื้นฐานแล้วฉันใช้jsPerfบน
- การทดสอบใน Chrome 65.0.3325 / Windows 10 0.0.0
- การทดสอบใน Edge 16.16299.0 / Windows 10 0.0.0
รูปแบบนิพจน์ทั่วไปที่ฉันทดสอบคือ
/[\W_]+/g
/[^a-z0-9]+/gi
/[^a-zA-Z0-9]+/g
ฉันโหลดมันขึ้นมาด้วยความยาวสตริงของอักขระสุ่ม
- ความยาว 5,000
- ความยาว 1,000
- ความยาว 200
ตัวอย่างจาวาสคริปต์ที่ฉันใช้ var newstr = str.replace(/[\W_]+/g," ");
การรันแต่ละครั้งประกอบด้วยตัวอย่าง 50 รายการขึ้นไปในแต่ละ regex และฉันเรียกใช้ 5 ครั้งในแต่ละเบราว์เซอร์
มาแข่งม้าของเรากัน!
ผล
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
เป็นที่ทราบกันดีอยู่แล้วว่า Regex ในเบราว์เซอร์ทั้งสอง (โดยคำนึงถึงค่าเบี่ยงเบน) นั้นแทบจะแยกไม่ออกอย่างไรก็ตามฉันคิดว่าถ้ามันทำงานมากขึ้นหลายครั้งผลลัพธ์จะชัดเจนขึ้นเล็กน้อย (แต่ไม่มาก)
มาตราส่วนตามทฤษฎีสำหรับ 1 อักขระ
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
ฉันจะไม่ใช้เวลามากในผลลัพธ์เหล่านี้เพราะนี่ไม่ใช่ความแตกต่างที่สำคัญจริงๆทั้งหมดที่เราบอกได้คือ edge ช้ากว่า: o นอกจากนี้ฉันยังเบื่อสุด ๆ
อย่างไรก็ตามคุณสามารถเรียกใช้เกณฑ์มาตรฐานสำหรับตัวคุณเองได้
Jsperf Benchmark ที่นี่