用一个空格替换所有非字母数字字符,换行和多个空格


136

我正在寻找可替代的整洁RegEx解决方案

  • 所有非字母数字字符
  • 所有换行
  • 空白的所有多个实例

一个空格


对于那些在家里玩的人(以下方法有效

text.replace(/[^a-z0-9]/gmi, " ").replace(/\s+/g, " ");

我的想法是RegEx可能强大到足以在一句话中实现这一目标。我认为需要的组件是

  • [^a-z0-9] -删除非字母数字字符
  • \s+ -匹配任何空间集合
  • \r?\n|\r -匹配所有新行
  • /gmi -全局,多行,不区分大小写

但是,我似乎无法以正确的方式设置正则表达式的样式(以下内容无效

text.replace(/[^a-z0-9]|\s+|\r?\n|\r/gmi, " ");


输入项

234&^%,Me,2 2013 1080p x264 5 1 BluRay
S01(*&asd 05
S1E5
1x05
1x5


期望的输出

234 Me 2 2013 1080p x264 5 1 BluRay S01 asd 05 S1E5 1x05 1x5

您的尝试到底有多有效?怎么了?
尖尖的2014年

Answers:



143

强尼5击败了我。我本来打算使用建议\W+\s作为 text.replace(/\W+/g, " ")。这也覆盖空白。


感谢@ T-CatSan指出这一点!调高音量,然后Saruman,您可以随意更改最佳答案:-)但是,应该\W+,不是[W+],新年快乐!
乔尼2014年

谢谢@ Jonny5!我已经做了您建议的更改。之前我已经测试过支架,现在我发现没有它们就可以使用。也祝你新年快乐。
T-CatSan 2014年

1
嘿@ T-CatSan是否可以添加例外?我想保留字符&-。有小费吗?
Renato Gama 2015年

1
我做了以下更改/(\ W +)|(_)/ g也忽略了_。但是只是想知道为什么它在第一个模型中没有被忽略,而我的正则表达式却是有效的。
Sridhar Gudimela


6

好吧,我认为您只需要为每个模式添加一个量词。回车的事情也有点有趣:

text.replace(/[^a-z0-9]+|\s+/gmi, " ");

编辑\s东西匹配\r\n太。


是的,在该主题的其他答案中搜集了一些汤姆傻瓜,但是非常感谢!
TheGeneral 2014年

2

一个人看到了另一个也有变音标记的帖子,这很棒

s.replace(/[^a-zA-Z0-9À-ž\s]/g, "")


2

这是我的老职位,被接受的答案大部分都是有益的。但是我决定对每个解决方案和另一个显而易见的解决方案进行基准测试(只是为了好玩)。我想知道在具有不同大小字符串的不同浏览器上的正则表达式模式之间是否存在差异。

所以基本上我用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

说实话,两种浏览器中的正则表达式(考虑到偏差)几乎无法区分,但是我认为,如果将其运行更多次,结果将变得更加清晰(但幅度不大)。

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基准测试


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.