更新
请注意,浏览器环境变化迅速,这些基准测试可能已经过时且可能会误导读者。
这是我以前的一篇文章,其他答案大部分都还不错。但是我决定对每个解决方案进行基准测试,以及另一个显而易见的方法(只是为了好玩)。我想知道在不同大小的字符串和不同浏览器上的正则表达式模式之间是否有差异。
所以,我基本上使用了 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
我用随机字符长度的字符串来测试它们
- 长度为 5000
- 长度为 1000
- 长度为 200
我使用的示例 JavaScript 代码是 var newstr = str.replace(/[\W_]+/g," ");
每次运行包括每个正则表达式的 50 个或更多样本,并在每个浏览器上运行它们 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
事实上,无论是在浏览器中还是其他地方,正则表达式的差异性都很小。但是,如果再多运行几次,结果可能会更加清晰一些(但改善程度不会太大)。
一个字符的理论缩放
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比较慢。另外,我当时非常无聊。
总之,您可以自行运行基准测试。
在这里查看Jsperf基准测试