2

英数字以外の文字をすべて置き換え、スペースをアンダースコアに置き換えたいと思います。これまでのところ、機能する複数の正規表現を使用してこれを考え出しましたが、より「効率的な」方法はありますか?

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

素晴らしい

4

2 に答える 2

1

注: 単一の正規表現でより高速なソリューションを思いつくことができると思いましたが、できませんでした。以下は、私の失敗した方法 (失敗から学ぶことができます)、パフォーマンス テストの結果、および私の結論です。

効率はさまざまな方法で測定できます。呼び出される関数の数を減らしたい場合は、単一の正規表現と関数を使用して置換を処理できます。

([A-Z])|(\s)|([^a-z\d])

レイ

最初のグループはtoLowerCase()適用され、2 番目は a に置き換えられ-、3 番目は何も返されません。最初+はグループ 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 '';
});

jsフィドル

パフォーマンス

私の方法は最悪のパフォーマンスでした:

Acheong87  fastest
Original   16% slower
Mine       53% slower

jsPerf

結論

あなたの方法は、コード開発時間の点で最も効率的であり、acheong87 の方法に対するパフォーマンスの低下は、コードの保守性、可読性、および複雑さの軽減によって相殺されます。速度が最も重要でない限り、私はあなたのバージョンを使用します。

正規表現にオプションの一致を追加するほど、パフォーマンスが低下します。関数の削減を除いて、私の方法の利点は考えられませんが、それはifステートメントと複雑さの増加によって相殺されます。

于 2013-08-20T16:15:57.717 に答える