どのようにJavaScriptの文字列のすべての出現を置き換えるには? [Javascript]

このエントリーをはてなブックマークに追加

質問:

この文字列があるとして:

"Test abc test test abc test test test abc test test abc"

以下をすると:

str = str.replace('abc', '');

上の文字列で最初のabcだけを取り除いているみたいだけど、どうやったらすべてのabsを置き換えることができる?

By Click Upvote | 質問日時: 2009年7月17日 17:53



回答1:

それをするには基本的に2つの方法があるよ。

注意: 一般的に、built-inのプロトタイプをJavaScriptで拡張することは一般的に推奨されてないよ。僕はString built-inプロトタイプに対する仮想的な標準メソッドの実装例を見せるために、Stringプロトタイプの拡張例としてこれを書いてる。


正規表現ベースの実装

String.prototype.replaceAll = function(search, replacement) {
var target = this;
return target.replace(new RegExp(search, 'g'), replacement);
};

Splitおよびjoinを用いた実装

String.prototype.replaceAll = function(search, replacement) {
var target = this;
return target.split(search).join(replacement);
};

効率の面で正規表現がどのように裏で何をやってるか昔はあまり知らなかったから、僕はsplitとjoinを使った実装を(パフォーマンスを考慮せずに)よく使ってきた。今はどっちがどのぐらい効率がいいかを調べるたいと思った時だけ使うようにしてる。

僕のChromeのWindows 8マシンでは、正規表現ベースの実装が一番速かった。splitとjoinの実装ではそれより53%遅くなった
この2つを実行しているベンチマークを見てみて。


注意すべきは、search通常の特殊文字として予約されている特定の文字式を含む場合、正規表現ベースの実装にはちょっと問題がある。この実装は、呼び出し側がそういう文字列をあらかじめエスケープするか、正規表現(MDN)テーブル内の文字を含まない文字列だけを渡しますことを前提としてる。

MDNは、文字列をエスケープするための実装も提供してる。これも RegExp.escape(str)として標準化されてたらよかったけど、まあ、それは
実現してない:

function escapeRegExp(str) {
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // $&はマッチした文字列全体を意味します
}

String.prototype.replaceAllの実装の中でescapeRegExpを呼び出すこともできる。でも僕はこれがどのくらいパフォーマンスに影響するか分からない(英数字の文字列のようにエスケープが必要でない文字列に対してすらも)。

By Cory Gross | 回答日時: 2013年7月12日 1:46



回答2:

str = str.replace(/abc/g, '');

それか

var find = 'abc';
var re = new RegExp(find, 'g');
str = str.replace(re, '');

さらに単純化すれば、

function replaceAll(str, find, replace) {
return str.replace(new RegExp(find, 'g'), replace);
}

注意: 正規表現には特別な(メタ)文字が含まれてる。だから、それらの文字をエスケープすること無しにfind関数の引数を盲目的に渡してしまうのは危険だ。これはMozilla Developer Network正規表現に関するJavaScriptガイドでカバーされてる。 そこでは次のユーティリティ関数が例示されてる:

function escapeRegExp(str) {
return str.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
}

だから、replaceAll()関数を上記より安全にするためにescapeRegExpもインクルードすると、以下のようになる:

function replaceAll(str, find, replace) {
return str.replace(new RegExp(escapeRegExp(find), 'g'), replace);
}

By Sean Bright | 回答日時: 2009年7月17日 17:54



Source: How to replace all occurrences of a string in JavaScript?

共有 コメント