我正在寻找一个简洁的正则表达式解决方案来替换
所有非字母数字字符
所有换行符
空白的所有多个实例
有一个空间
对于那些在家玩的人(以下确实有效)
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
请注意,\W
leaves the underscore。 [^a-zA-Z0-9]
的简短等效项是 [\W_]
text.replace(/[\W_]+/g," ");
\W
是 shorthand \w
对 [A-Za-z0-9_]
个单词字符(包括下划线)的否定
Jonny 5 打败了我。我将建议在 text.replace(/\W+/g, " ")
中使用不带 \s
的 \W+
。这也涵盖了空白。
\W+
,而不是 [W+]
好吧,祝大家新年快乐!
&
和 -
。有小费吗?
由于 [^a-z0-9]
字符类包含所有不是 alnum 的内容,因此它也包含白色字符!
text.replace(/[^a-z0-9]+/gi, " ");
好吧,我认为您只需要为每个模式添加一个量词。回车的事情也有点有趣:
text.replace(/[^a-z0-9]+|\s+/gmi, " ");
edit \s
事物也匹配 \r
和 \n
。
更新
请注意,浏览器环境变化迅速,这些基准测试将严重过时,并且在您阅读本文时可能会产生误导。
这是我的一个旧帖子,其他答案大部分都很好。但是,我决定对每个解决方案和另一个明显的解决方案进行基准测试(只是为了好玩)。我想知道具有不同大小字符串的不同浏览器上的正则表达式模式之间是否存在差异。
所以基本上我使用了 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 。此外,我超级无聊。
无论如何,您可以为自己运行基准测试。
A看到另一个帖子也有变音符号,这很棒
s.replace(/[^a-zA-Z0-9À-ž\s]/g, "")
要替换为破折号,请执行以下操作:
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}]+/顾,``))
\W
还将非拉丁字符识别为非单词字符。