文字列のすべての出現箇所を置換する方法

javascript string replace


この文字列を持っています。

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

Doing:

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

の最初の発生のみを削除するようです abc 上記の文字列で abcようです。

どうすればそれをすべて置き換えることができますか?




Answer 1 Matthew Crumley


注:パフォーマンスが重要なコードではこれを使用しないでください。

単純なリテラル文字列の正規表現の代わりに

str = "Test abc test test abc test...".split("abc").join("");

一般的なパターンは

str.split(search).join(replacement)

replaceAll は、replaceAllを使用するよりも高速でした。、や正規表現ありましたが、最近のブラウザではそうではないようです。

基準: https //jsperf.com/replace-all-vs-split-join

結論。パフォーマンスが重要なユースケース(例えば何百もの文字列を処理するなど)では、Regexpメソッドを使用してください。しかし、ほとんどの典型的なユースケースでは、これは特殊文字を気にしなくて済むだけの価値があります。




Answer 2 Sean Bright


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

コメントに反応して

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

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

Click Upvoteのコメントに応じて、さらに簡略化できます。

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

注:正規表現には特殊な(メタ)文字が含まれているため、これらの文字をエスケープするために前処理せずに上記の find 関数で引数を盲目的に渡すことは危険です。これは、Mozilla Developer Network正規表現に関するJavaScriptガイドで説明されており、次のユーティリティ関数が示されています(この回答は最初に作成されてから少なくとも2回変更されているため、MDNサイトで更新の可能性を確認してください)。

function escapeRegExp(string) {
  return string.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
}

だから、作るために replaceAll() あなたにも含まれている場合より安全上の機能を、それは次のように変更することができ escapeRegExp を:

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



Answer 3 Cory Gross


完結させるためには、どの方法を使えばいいのかを考えるようになりました。このページの他の回答が示唆しているように、基本的には2つの方法があります。

注:一般に、JavaScriptで組み込みプロトタイプを拡張することは、一般的には推奨されません。説明のために、Stringプロトタイプの拡張として、 String 組み込みプロトタイプの架空の標準メソッドのさまざまな実装を示します。


正規表現に基づく実装

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

分割と結合(機能)の実装

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

効率性の面で正規表現が舞台裏でどのように機能しているのかをあまり知らないので、過去にはパフォーマンスのことは考えずに分割と結合の実装に傾く傾向がありました。どちらがより効率的で、どの程度のマージンで効率的なのか疑問に思ったときは、それを見つけるための口実にしました。

私のChrome Windows 8マシンでは、正規表現ベースの実装が最速で、分割と結合の実装は53%遅くなっています。正規表現は、私が使用したlorem ipsum入力の2倍の速さです。

これら2つの実装を相互に実行するこのベンチマークを確認してください。


下記の@ThomasLeducなどのコメントで述べたように、正規表現で特殊文字として予約されている特定の文字が search 含まれている場合、正規表現ベースの実装で問題が発生する可能性があります。実装では、呼び出し元が事前に文字列をエスケープするか、正規表現のテーブルに文字がない文字列のみを渡すことを前提としています(MDN)の。

MDNは、文字列をエスケープするための実装も提供します。これも RegExp.escape(str) として標準化されていると便利ですが、残念ながら存在しません。

function escapeRegExp(str) {
  return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
}

私たちは、呼び出すことができ escapeRegExp を私たちの内 String.prototype.replaceAll 実装が、これがパフォーマンスにどの程度影響するかはわかりません(すべての英数字文字列のように、エスケープが不要な文字列でも可能性があります)。




Answer 4 Adam A


g フラグを設定した正規表現を使用すると、すべてが置き換えられます。

someString = 'the cat looks like a cat';
anotherString = someString.replace(/cat/g, 'dog');
// anotherString now contains "the dog looks like a dog"

こちらもご覧ください。




Answer 5 jesal


ここでは、受け入れられた答えに基づいて、文字列のプロトタイプ関数を作成します。

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

EDIT

find に特殊文字が含まれる場合は、それらをエスケープする必要があります。

String.prototype.replaceAll = function (find, replace) {
    var str = this;
    return str.replace(new RegExp(find.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), 'g'), replace);
};

フィドル:http : //jsfiddle.net/cdbzL/