我想替换所有非字母数字字符,并用下划线替换空格。到目前为止,我已经使用多个正则表达式来实现这一点,但它有效吗?
"Well Done!".toLowerCase().replace(/\s/, '-').replace(/[^\w-]/gi, '');
做得好
答案 0 :(得分:2)
至少在其他语言中,调用正则表达式引擎很昂贵。我不确定JavaScript是否属实,但这就是你如何做到“C风格”。我确信自己对其性能进行基准测试将是一次宝贵的学习经历。
var x = "Well Done!";
var y = "";
var c;
for (var i = 0; i < x.length; i++)
{
c = x.charCodeAt(i);
if (c >= 48 && c <= 57 || c >= 97 && c <= 122)
{
y += x[i];
}
else if (c >= 65 && c <= 90)
{
y += String.fromCharCode(c+32);
}
else if (c == 32 || c >= 9 && c <= 13)
{
y += '-';
}
}
$('#output').html(y);
有关ASCII代码,请参阅http://www.asciitable.com/。这是a jsFiddle。请注意,我还通过在大写字母中添加32来实现toLowerCase()
。
<强>声明强>
当然,我个人更喜欢可读代码,因此更喜欢正则表达式,或者使用某种strtr
函数(如果JavaScript中存在)。这个答案纯粹是为了教育。
答案 1 :(得分:1)
注意: 我以为我可以用一个正则表达式提出更快的解决方案,但我做不到。下面是我失败的方法(你可以从失败中学习),以及性能测试的结果和我的结论。
效率可以通过多种方式衡量。如果您想减少调用的函数数量,那么您可以使用单个正则表达式和函数来处理替换。
([A-Z])|(\s)|([^a-z\d])
<强> REY 强>
第一组将应用toLowerCase()
,第二组将替换为-
,第三组将不返回任何内容。我最初对组1和组3使用了+
量词,但考虑到文本的预期性质,删除它会导致更快的执行。 (感谢acheong87)
'Well Done!'.replace(/([A-Z])|(\s)|([^a-z\d])/g, function (match, $0, $1) {
if ($0) return String.fromCharCode($0.charCodeAt(0) + 32);
else if ($1) return '-';
return '';
});
<强> jsFiddle 强>
<强>性能强>
我的方法表现最差:
Acheong87 fastest
Original 16% slower
Mine 53% slower
<强> jsPerf 强>
<强>结论强>
在代码开发时间方面,方法是最有效的,而acheong87方法的性能损失被代码可维护性,可读性和复杂性降低所抵消。除非速度至关重要,否则我会使用你的版本。
我添加到正则表达式的可选匹配越多,性能损失就越大。除了函数减少之外,我无法想到我的方法有什么优点,但是if
语句会抵消这种优势并增加复杂性。