英数字以外の文字をすべて置き換え、スペースをアンダースコアに置き換えたいと思います。これまでのところ、機能する複数の正規表現を使用してこれを考え出しましたが、より「効率的な」方法はありますか?
"Well Done!".toLowerCase().replace(/\s/, '-').replace(/[^\w-]/gi, '');
素晴らしい
英数字以外の文字をすべて置き換え、スペースをアンダースコアに置き換えたいと思います。これまでのところ、機能する複数の正規表現を使用してこれを考え出しましたが、より「効率的な」方法はありますか?
"Well Done!".toLowerCase().replace(/\s/, '-').replace(/[^\w-]/gi, '');
素晴らしい
注: 単一の正規表現でより高速なソリューションを思いつくことができると思いましたが、できませんでした。以下は、私の失敗した方法 (失敗から学ぶことができます)、パフォーマンス テストの結果、および私の結論です。
効率はさまざまな方法で測定できます。呼び出される関数の数を減らしたい場合は、単一の正規表現と関数を使用して置換を処理できます。
([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 '';
});
パフォーマンス
私の方法は最悪のパフォーマンスでした:
Acheong87 fastest
Original 16% slower
Mine 53% slower
結論
あなたの方法は、コード開発時間の点で最も効率的であり、acheong87 の方法に対するパフォーマンスの低下は、コードの保守性、可読性、および複雑さの軽減によって相殺されます。速度が最も重要でない限り、私はあなたのバージョンを使用します。
正規表現にオプションの一致を追加するほど、パフォーマンスが低下します。関数の削減を除いて、私の方法の利点は考えられませんが、それはif
ステートメントと複雑さの増加によって相殺されます。