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

问题描述 投票:108回答:6

我正在寻找一个简洁的RegEx解决方案来取代

  • 所有非字母数字字符
  • 所有NewLines
  • 所有多个空格实例

有一个空间


对于那些在家里玩的人(以下工作)

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

我的想法是RegEx可能足以在一个声明中实现这一点。我觉得id需要的组件是

  • qazxsw poi - 删除非字母数字字符
  • [^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
javascript regex replace alphanumeric
6个回答
185
投票

请注意,那234 Me 2 2013 1080p x264 5 1 BluRay S01 asd 05 S1E5 1x05 1x5 \Wleaves the underscore的短暂等价物是[^a-zA-Z0-9]

[\W_]

text.replace(/[\W_]+/g," "); \W shorthand\w单词字符(包括下划线)的否定

[A-Za-z0-9_]


141
投票

强尼5击败了我。我打算建议在Example at regex101.com使用没有\W+\s。这也涵盖了空白区域。


11
投票

由于text.replace(/\W+/g, " ")字符类包含所有不是alnum的字符,它也包含白色字符!

[^a-z0-9]

5
投票

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

 text.replace(/[^a-z0-9]+/gi, " ");

编辑text.replace(/[^a-z0-9]+|\s+/gmi, " "); 事情也匹配\s\r


2
投票

看到一个不同的帖子也有变音符号,这很棒

\n


1
投票

这是我的一个老帖子,接受的答案大部分都是好的。但是我决定对每个解决方案和另一个明显的解决方案进行基准测试我想知道在不同浏览器上使用不同大小的字符串的正则表达式模式之间是否存在差异。

所以基本上我用s.replace(/[^a-zA-Z0-9À-ž\s]/g, "")

  • 在Chrome 65.0.3325 / Windows 10中测试0.0.0
  • 边缘16.16299.0 / Windows 10中的测试0.0.0

我测试的正则表达式模式是

  • jsPerf
  • /[\W_]+/g
  • /[^a-z0-9]+/gi

我用一串随机字符加载它们

  • 长度5000
  • 长度1000
  • 长度200

示例javascript我使用/[^a-zA-Z0-9]+/g

每次运行由每个正则表达式上的50个或更多样本组成,并且我在每个浏览器上运行它们5次。

让我们的马匹比赛!

结果

var newstr = str.replace(/[\W_]+/g," ");

真相众所周知,两种浏览器中的正则表达式(考虑到偏差)几乎无法区分,但我认为如果它运行得更多次,结果会变得更清晰(但不是很多)。

1个字符的理论缩放

                                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

我不会对这些结果有太大的影响,因为这并不是一个显着的差异,我们真正能说的是边缘较慢:o。另外,我非常无聊。

无论如何,你可以为自己运行基准测试。

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

© www.soinside.com 2019 - 2024. All rights reserved.