AAA*_*ddd 118 javascript regex replace alphanumeric
我正在寻找一个简洁的RegEx解决方案来取代
有一个空间
对于那些在家里玩的人(以下工作)
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_]
Cas*_*yte 13
由于[^a-z0-9]字符类包含的不是alnum,它也包含白色字符!
text.replace(/[^a-z0-9]+/gi, " ");
Run Code Online (Sandbox Code Playgroud)
当 Unicode 发挥作用时
\ntext.replace(/[^\\p{L}\\p{N}]+/gu," ");\nRun Code Online (Sandbox Code Playgroud)\n解释
\nNODE EXPLANATION\n--------------------------------------------------------------------------------\n [^\\p{L}\\p{N}]+ Any character except Unicode letters and digits\n (1 or more times (matching the most amount possible))\nRun Code Online (Sandbox Code Playgroud)\nJavaScript 代码片段:
\nconst 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好吧,我认为你只需要为每个模式添加一个量词.回车的事情也有点滑稽:
text.replace(/[^a-z0-9]+|\s+/gmi, " ");
Run Code Online (Sandbox Code Playgroud)
编辑的\s东西匹配\r和\n太.
更新
请注意,浏览器环境变化很快,这些基准测试可能已经过时了,并且在您阅读本文时可能会产生误导。
这是我的旧帖子,其他答案大部分都很好。然而,我决定对每个解决方案和另一个明显的解决方案进行基准测试(只是为了好玩)。我想知道不同浏览器上具有不同大小字符串的正则表达式模式之间是否存在差异。
所以基本上我使用了jsPerf
我测试的正则表达式模式是
/[\W_]+/g/[^a-z0-9]+/gi/[^a-zA-Z0-9]+/g我用随机字符的字符串长度加载了它们
我使用的示例 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。另外我非常无聊。
无论如何,您可以自己运行基准测试。
| 归档时间: |
|
| 查看次数: |
131571 次 |
| 最近记录: |