是否有更清晰的方法来删除非字母数字字符并替换空格?

时间:2013-08-20 12:56:10

标签: javascript regex

我想替换所有非字母数字字符,并用下划线替换空格。到目前为止,我已经使用多个正则表达式来实现这一点,但它有效吗?

"Well Done!".toLowerCase().replace(/\s/, '-').replace(/[^\w-]/gi, '');
  

做得好

2 个答案:

答案 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语句会抵消这种优势并增加复杂性。