我正在寻找可替代的整洁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
请注意,这\W
留下了下划线。短等效[^a-zA-Z0-9]
会[\W_]
text.replace(/[\W_]+/g," ");
\W
是对单词字符(包括下划线)的简写 取反\w
[A-Za-z0-9_]
强尼5击败了我。我本来打算使用建议\W+
不\s
作为 text.replace(/\W+/g, " ")
。这也覆盖空白。
由于[^a-z0-9]
字符类包含所有非数字字符,因此它也包含白色字符!
text.replace(/[^a-z0-9]+/gi, " ");
好吧,我认为您只需要向每个模式添加一个量词。回车的事情也有点有趣:
text.replace(/[^a-z0-9]+|\s+/gmi, " ");
编辑的\s
东西匹配\r
和\n
太。
A看到了另一个也有变音标记的帖子,这很棒
s.replace(/[^a-zA-Z0-9À-ž\s]/g, "")
这是我的老职位,被接受的答案大部分都是好的。但是我决定对每个解决方案和另一个显而易见的解决方案进行基准测试(只是为了好玩)。我想知道在具有不同大小的字符串的不同浏览器上的正则表达式模式之间是否存在差异。
所以基本上我用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
我不会过多地考虑这些结果,因为这并不是真正的显着差异,我们只能说Edge慢一些:o。另外,我超级无聊。
无论如何,您都可以为自己运行基准测试。
要用破折号代替,请执行以下操作:
text.replace(/[\W_-]/g,' ');
对于在上述更多专家回复后仍在挣扎的人(如我...),此方法适用于Visual Studio 2019:
outputString = Regex.Replace(inputString, @"\W", "_");
记住要添加
using System.Text.RegularExpressions;
文章标签:alphanumeric , javascript , regex , replace
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!
评论已关闭!