我正在寻找一个简洁的 RegEx 解决方案来取代
只有一个空格
<小时/>
对于那些在家里玩的人(以下工作)
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
答案 0 :(得分:175)
请注意,\W
leaves the underscore。 [^a-zA-Z0-9]
的简短等效值为[\W_]
text.replace(/[\W_]+/g," ");
\W
是对\w
个字符(包括下划线)的shorthand [A-Za-z0-9_]
的否定
答案 1 :(得分:138)
Jonny 5打败了我。我打算建议在\W+
中使用不\s
的{{1}}。这也涵盖了空白区域。
答案 2 :(得分:11)
由于[^a-z0-9]
字符类包含的不是alnum,它也包含白色字符!
text.replace(/[^a-z0-9]+/gi, " ");
答案 3 :(得分:5)
嗯,我认为你只需要为每个模式添加一个量词。回车的事情也有点滑稽:
text.replace(/[^a-z0-9]+|\s+/gmi, " ");
编辑 \s
事件也匹配\r
和\n
。
答案 4 :(得分:2)
看到一个不同的帖子,也有变音符号,这很棒
s.replace(/[^a-zA-Z0-9À-ž\s]/g, "")
答案 5 :(得分:1)
这是我的一个老帖子,接受的答案大部分都是好的。但是我决定对每个解决方案和另一个明显的解决方案进行基准测试我想知道在不同浏览器上使用不同大小的字符串的正则表达式模式之间是否存在差异。
所以基本上我在
上使用了jsPerf我测试的正则表达式是
/[\W_]+/g
/[^a-z0-9]+/gi
/[^a-zA-Z0-9]+/g
我用字符串长度的随机字符加载它们
使用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。另外,我非常无聊。
无论如何,你可以为自己运行基准测试。
答案 6 :(得分:1)
要用破折号代替,请执行以下操作:
text.replace(/[\W_-]/g,' ');
答案 7 :(得分:1)
对于在上述更多专家回复后仍在挣扎的人(如我...),此方法在Visual Studio 2019中有效:
outputString = Regex.Replace(inputString, @"\W", "_");
记住要添加
using System.Text.RegularExpressions;