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

AAA*_*ddd 118 javascript regex replace alphanumeric

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

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

有一个空间


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

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

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

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

但是,我似乎无法以正确的方式设置正则表达式(以下不起作用)

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


输入

234&^%,Me,2 2013 1080p x264 5 1 BluRay
S01(*&asd 05
S1E5
1x05
1x5
Run Code Online (Sandbox Code Playgroud)


期望的输出

234 Me 2 2013 1080p x264 5 1 BluRay S01 asd 05 S1E5 1x05 1x5
Run Code Online (Sandbox Code Playgroud)

Jon*_*y 5 199

请注意,这\W 留下了下划线.[^a-zA-Z0-9]将是一个短暂的等价物[\W_]

text.replace(/[\W_]+/g," ");
Run Code Online (Sandbox Code Playgroud)

\W是对单词字符(包括下划线)的简写 的否定\w[A-Za-z0-9_]

regex101.com上的示例

  • 请注意,`\ W`也会将非拉丁字符识别为非字符字符. (5认同)
  • 为什么这不是公认的答案? (2认同)
  • 这些年来,我将这个答案标记为正确,因为我回头看,接受的不排除下划线 (2认同)

T-C*_*San 142

强尼5击败了我.我打算建议使用\W+没有\sas in text.replace(/\W+/g, " ").这也涵盖了空白区域.


Cas*_*yte 13

由于[^a-z0-9]字符类包含的不是alnum,它也包含白色字符!

 text.replace(/[^a-z0-9]+/gi, " ");
Run Code Online (Sandbox Code Playgroud)


Rys*_*ech 7

当 Unicode 发挥作用时

\n
text.replace(/[^\\p{L}\\p{N}]+/gu," ");\n
Run Code Online (Sandbox Code Playgroud)\n

解释

\n
NODE                     EXPLANATION\n--------------------------------------------------------------------------------\n  [^\\p{L}\\p{N}]+           Any character except Unicode letters and digits\n                           (1 or more times (matching the most amount possible))\n
Run Code Online (Sandbox Code Playgroud)\n

JavaScript 代码片段

\n

\r\n
\r\n
const text = `234&^%,Me,2 2013 1080p x264 5 1 BluR\xc4\x85y\nS01(*&a\xc5\x9bd 05\nS1E5\n1x05\n1x5`\nconsole.log(text.replace(/[^\\p{L}\\p{N}]+/gu, ` `))
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n


Poi*_*nty 6

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

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

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


AAA*_*ddd 6

更新

请注意,浏览器环境变化很快,这些基准测试可能已经过时了,并且在您阅读本文时可能会产生误导。


这是我的旧帖子,其他答案大部分都很好。然而,我决定对每个解决方案和另一个明显的解决方案进行基准测试(只是为了好玩)。我想知道不同浏览器上具有不同大小字符串的正则表达式模式之间是否存在差异。

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

我使用的示例 javascriptvar 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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

我不会过多考虑这些结果,因为这并不是真正的显着差异,我们真正能看出的是边缘速度较慢:o。另外我非常无聊。

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

Jsperf 基准测试在这里