【问题标题】:Replace all non alphanumeric characters, new lines, and multiple white space with one space用一个空格替换所有非字母数字字符、换行符和多个空格
【发布时间】:2014-01-18 20:02:42
【问题描述】:

我正在寻找一个简洁的正则表达式解决方案来替换

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

只有一个空格


对于那些在家玩的人(以下确实有效

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

【问题讨论】:

  • 您的尝试究竟是如何失败的?出了什么问题?

标签: javascript regex replace alphanumeric


【解决方案1】:

请注意,\W leaves the underscore[^a-zA-Z0-9] 的简短等效项是 [\W_]

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

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

Example at regex101.com

【讨论】:

  • 检查并测试它,对 js-regex 还没有太多经验 :p 很高兴你喜欢它
  • 请注意,\W 也会将非拉丁字符识别为非单词字符。
  • 这么多年后我把这个答案标记为正确,因为我回头看,接受并没有排除下划线
【解决方案2】:

Jonny 5 击败了我。我将建议使用\W+,而不使用\s,如text.replace(/\W+/g, " ")。这也涵盖了空白。

【讨论】:

  • 感谢@T-CatSan 指出这一点!升级它,Saruman,你可以随意更改最佳答案 :-) 但应该是 \W+,而不是 [W+] 好吧,祝大家新年快乐!
  • 谢谢,@Jonny5!我已经按照您的建议进行了更改。我以前用括号测试过,现在我发现没有它们也可以工作。也祝你新年快乐。
  • 嘿@T-CatSan 有没有办法添加例外?我想保留字符&-。有什么建议吗?
  • 我做了以下更改 /(\W+)|(_)/g 也忽略了 _。但只是想知道为什么它在第一个模型中没有被忽略并且我的正则表达式是有效的。
【解决方案3】:

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

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

【讨论】:

  • 不错,工作正常
【解决方案4】:

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

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

edit \s 也匹配 \r\n

【讨论】:

  • 是的,从关于该主题的其他答案中收集到了一些汤姆愚蠢的东西,但是非常感谢!
【解决方案5】:

更新

请注意,浏览器环境瞬息万变,这些基准测试将严重过时,并且在您阅读本文时可能会产生误导。


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

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

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

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

Jsperf Benchmark here

【讨论】:

    【解决方案6】:

    A看到另一个帖子也有变音符号,这很棒

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

    【讨论】:

      【解决方案7】:

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

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

      【讨论】:

        【解决方案8】:

        对于在上述更多专家回复后仍在苦苦挣扎的人(如我......),这适用于 Visual Studio 2019:

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

        记得添加

        using System.Text.RegularExpressions;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-03-31
          • 1970-01-01
          • 2014-11-20
          • 2010-12-20
          • 2012-01-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多