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

我正在寻找一个整洁的正则表达式解决方案,以取代

  • 所有非字母数字字符
  • 都是新台词
  • 所有空格的多个实例

只有一个空间


适用于在家中玩耍的人士(下面这些确实有用)

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

我的想法是,正则表达式可能足够强大,可以在一个声明中实现这一点。我想我需要的部件是

  • [^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
197396 次浏览

我认为你只需要在每个图案上加一个量词。还有回程的事情有点好笑:

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

编辑 \s的东西也匹配 \r\n

请注意,\W 留下下划线[^a-zA-Z0-9]的简称是 [\W_]

text.replace(/[\W_]+/g," ");

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

例如 regex101.com

因为 [^a-z0-9]字符类包含所有不是校友,它也包含白色字符!

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

强尼五号抢在我前面了。我想建议使用 \W+而不使用 \s,就像在 text.replace(/\W+/g, " ")中一样。这也涵盖了空白区域。

看到一个不同的帖子,也有发音符号,这是伟大的

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

更新

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


这是我的一个老帖子,其他的答案大部分都是好的。然而,我决定对每个解决方案和另一个显而易见的解决方案进行基准测试(只是为了好玩)。我想知道使用不同大小字符串的不同浏览器上的正则表达式模式是否有区别。

所以基本上我使用 JsPerf

  • Chrome 65.0.3325/Windows 100.0.0中的测试
  • 在 Edge 16.16299.0/Windows 100.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 Benchmark

要用破折号替换,请执行以下操作:

text.replace(/[\W_-]/g,' ');

对于那些在以上更多专家回复之后仍在苦苦挣扎的人(比如我... ...) ,这在 Visual Studio 2019中可行:

outputString = Regex.Replace(inputString, @"\W", "_");

记得加上

using System.Text.RegularExpressions;

在使用 Unicode 时,请使用

text.replace(/[^\p{L}\p{N}]+/gu," ");

解释

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

JavaScript 代码片段 :

const text = `234&^%,Me,2 2013 1080p x264 5 1 BluRąy
S01(*&aśd 05
S1E5
1x05
1x5`
console.log(text.replace(/[^\p{L}\p{N}]+/gu, ` `))

const processStirng = (str) => (
str
.replace(/[^a-z0-9\s]/gi, '') // remove all but alpha-numeric and spaces
.replace(/ +/g, ' '); // remove duplicated spaces
);
processSting(' $ your    string    here #');