文字列のすべての出現を置き換える方法は?


4382

私はこの文字列を持っています:

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

実行:

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

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

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


5
abainのすべての出現をに置き換えるababaca、どの結果が予想されますか?cabaabcacca
reinierpost

String.prototype.replaceAll()Safari 13.1で出荷され、Firefox NightlyとChrome Dev and Canaryで出荷され、Firefox 77とChrome 85で出荷されます。MDNではまだドキュメント化されていませんが、github.com / tc39 / proposal-string-replaceall#high-level-api説明があります。「searchValueが文字列の場合、searchValueのすべての出現箇所をString.prototype.replaceAll置き換えます(あたかもグローバルまたは適切にエスケープされた正規表現が使用されたかのように)。場合searchValueが非グローバル正規表現で、」例外をスローします.split(searchValue).join(replaceValue)String.prototype.replaceAll
sideshowbarker

回答:


1610

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

単純なリテラル文字列の正規表現の代わりに、次を使用できます

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

一般的なパターンは

str.split(search).join(replacement)

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

ベンチマーク:https : //jsperf.com/replace-all-vs-split-join

結論:パフォーマンスが重要なユースケース(たとえば、数百の文字列の処理)がある場合は、Regexpメソッドを使用します。しかし、ほとんどの一般的な使用例では、これは特殊文字について心配する必要がないという価値があります。


147
このメソッドはより多くのオブジェクトを割り当て、ガベージを作成し、時間がかかるため、驚いたのですが、実際にブラウザーでテストしたところ、このメソッドは受け入れられた応答よりも常に約20%高速でした。もちろん結果は異なる場合があります。
MgSam 2013

42
私は気になっていましたが、これを設定しました:jsperf.com/replace-all-vs-split-join。他のJavaScriptエンジンと比較して、v8は配列の分割/結合が非常に速いようです。
fabi 2013年

8
とても良い-特殊文字を渡すときにRegExpsが不正になる可能性もありません。オブジェクトプロパティに「これを見つけて置き換える」ための汎用フラグを追加していますが、「。」を置き換える必要があるかどうか心配でした。または「}」で、3か月後にRegExを使用していたのを忘れていました。
tobriand 14

9
そしてString.prototypeとして:String.prototype.replaceAll = function(f,r){return this.split(f).join(r);}。使用法:"My string".replaceAll('st', '');「マイリング」を生成する
MacroMan '26

8
これを本番環境で使用しないという警告の理由はわかりません。これは、複数のオカレンスを置き換えたいという理由だけで正規表現をエスケープする以上のハックではありませんが、そもそも正規表現を必要としません。このいわゆる「ハック」を素敵なreplaceAll関数でラップするだけで、他と同じように読みやすくなります。パフォーマンスは悪くないので、このソリューションを回避する理由はありません。
youen

4384
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);
}

4
正規表現は、独自の「replaceAll」メソッドを実装せずにこの「すぐに」使用できる唯一の方法です。私はそれらを使用するためだけにそれらを使用することを提案していません。
ショーンブライト

10
これは、このコメントから私自身の機能である: function replaceAll(find, replace,str) { var re = new RegExp(find, 'g'); str = str.replace(re, replace); return str; }
Upvoteクリックして

47
replaceAll実装の主な注意点は、findメタ文字が含まれていると機能しないことです。
マーティンエンダー2013

1
@SeanBrightあなたは正しい。私はあなたのjavascriptをphpコードで使用したので、エスケープするために余分なバックスラッシュを追加する必要がありました。フィドルでは、コードは完璧です。確認しておくべきだった。謝罪jsfiddle.net/7y19xyq8
Onimusha


2437

完全を期すために、私はこれを行うためにどの方法を使用するべきかについて考えるようになりました。このページの他の回答で提案されているように、これを行うには基本的に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が、これがパフォーマンスにどの程度影響するかはわかりません(すべての英数字文字列のように、エスケープが不要な文字列でも可能性があります)。


8
Android 4.1では、regexpメソッドは15%高速ですが、検索する式をエスケープしていないため、このベンチマークは不完全です。
andreszs 2015年

33
このソリューションには問題があり、検索文字列に正規表現の特殊文字が含まれているように見える場合、それらは解釈されます。@Sandy Unitedwolfの回答をお勧めします。
トーマスルダック

2
最初のものはこれを行います: 'bla.bla'.replaceAll('。 '、' _ '); 「_______」。2つ目は、「bla_bla」を実行します。これは、より一般的には、実行したいことです。
RobKohr、2016

1
@ThomasLeducあなたが言及した問題はlodash => lodash.com/docs/4.17.5#escapeRegExp
Matthew Beck

1
ネイティブオブジェクトを拡張する理由も不思議に思っている、将来の視聴者のためにここにこれを放置すると、悪い考えです:stackoverflow.com/questions/14034180/...
ベン・クーパー

692

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

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

こちらもご覧ください


15
ちょっとばかげていると思いますが、JSグローバル正規表現が複数の置換を行う唯一の方法です。
マイク、

5
うまく技術的に、あなたはループスルーできるvar sourceTextインスタンスの数(カウントnumOfInstances)を使用しsubstringたり、分割して(他の戦略の中で)の長さを数えるのthatWhichYouWantToReplace行い、その後for (var i = 0; i < numOfInstances; i++){ sourceText = sourceText.replace('thatWhichYouWantToReplace', '');}またはさらに簡単ちょうどwhileループ(使用while sourceText.indexOf(thatWhichYouWantToReplace > -1){ sourceText = sourceText.replace(...))をしかし、あなたがしたいと思う私はなぜ表示されません使用/gが非常に簡単でおそらくパフォーマンスが高い場合は、そのようにしてください。
Zargold 2016年

@Zargoldループを実行して、置換後もすべてのインスタンスを置換したことを確認する必要がありますが、これはかなり一般的な問題です。下記の私の答えを参照してくださいstackoverflow.com/a/26089052/87520
SamGoody

109

受け入れられた回答に基づく文字列プロトタイプ関数は次のとおりです。

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

編集する

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

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

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


5
しかし、正規表現でのfindような文字.$特殊な意味を持つ文字が含まれている場合はどうなりますか?
2013年

1
@callumその場合は、検索変数をエスケープする必要があります(上記の編集を参照)。
jesal


jesal、これは私が遭遇した文字列置換の問題に対する素晴らしい解決策であり、JavaScriptの文字列の「不変性」を明らかに克服しています。このプロトタイプ関数が文字列の不変性をオーバーライドする方法について、あなたまたは他の誰かが説明できますか?これ機能します。それがもたらすこの付随的な質問を理解したいだけです。
Tom

1
@Tom:それ不変性をまったく克服しません:メソッドが適用されるvar str = this不変文字列への2番目の参照を作成し、replace次に新しい不変文字列を返します。これらのプロトタイプの機能がない場合は、あなたが書くことができるだろう、新しい不変の文字列を返すsomeStrVar.replaceAll('o', '0');someStrVar変更されます。代わりに、someStrVar = someStrVar.replaceAll('o', '0');<-reassign と記述して、新しい不変文字列を保持するように変数を設定する必要があります。それを回避する方法はありません。コンソールで試してみてください:x = 'foobar'; x.replaceAll('o', '0'); x;
エリアスヴァンOotegem

87

更新:

アップデートには少し遅れますが、私はこの質問に出くわしただけで、以前の答えが満足のいくものではないことに気づきました。質問は単一の単語を置き換えることを含むため、単語の境界を使用することを誰も考えなかったのは驚くべきことです(\b

'a cat is not a caterpillar'.replace(/\bcat\b/gi,'dog');
//"a dog is not a caterpillar"

これは、ほとんどの場合、単語の一部の置き換えを回避する単純な正規表現です。ただし、ダッシュ-は単語の境界と見なされます。したがって、この場合は条件文を使用して、次のような文字列の置換を回避できますcool-cat

'a cat is not a cool-cat'.replace(/\bcat\b/gi,'dog');//wrong
//"a dog is not a cool-dog" -- nips
'a cat is not a cool-cat'.replace(/(?:\b([^-]))cat(?:\b([^-]))/gi,'$1dog$2');
//"a dog is not a cool-cat"

基本的に、この質問はここの質問と同じです:Javascriptは「」を「」に置き換えます

@マイク、私がそこに与えた答えを確認してください... regexpは、subsrtingの複数のオカレンスを置換する唯一の方法ではありません。柔軟に考えて、分割して考えてください!

var newText = "the cat looks like a cat".split('cat').join('dog');

あるいは、単語の部分の置き換えを防ぐために-承認された回答でも可能です!この問題は、正規表現を使用して回避できます。正規表現は、やや複雑で、その結果、少し遅くなります。

var regText = "the cat looks like a cat".replace(/(?:(^|[^a-z]))(([^a-z]*)(?=cat)cat)(?![a-z])/gi,"$1dog");

出力は受け入れられた回答と同じですが、この文字列で/ cat / g式を使用しています。

var oops = 'the cat looks like a cat, not a caterpillar or coolcat'.replace(/cat/g,'dog');
//returns "the dog looks like a dog, not a dogerpillar or cooldog" ?? 

確かに、これはおそらくあなたが望むものではありません。それでは何ですか?IMHO、条件付きで「猫」のみを置き換える正規表現。(つまり、単語の一部ではない)、次のように:

var caterpillar = 'the cat looks like a cat, not a caterpillar or coolcat'.replace(/(?:(^|[^a-z]))(([^a-z]*)(?=cat)cat)(?![a-z])/gi,"$1dog");
//return "the dog looks like a dog, not a caterpillar or coolcat"

私の推測では、これはあなたのニーズを満たしています。もちろん、それは完全なものではありませんが、開始するには十分なはずです。これらのページでさらに読むことをお勧めします。これは、特定のニーズを満たすためにこの表現を完成させるのに役立ちます。

http://www.javascriptkit.com/jsref/regexp.shtml

http://www.regular-expressions.info


最終追加:

この質問はまだ多くのビューを取得しているので.replace、コールバック関数での使用例を追加すると思います。この場合、それが劇的に表現を簡素化し、正しい大文字小文字に置き換え、またはその両方を交換するように、さらに多くの柔軟性を提供catし、cats一度に:

'Two cats are not 1 Cat! They\'re just cool-cats, you caterpillar'
   .replace(/(^|.\b)(cat)(s?\b.|$)/gi,function(all,char1,cat,char2)
    {
       //check 1st, capitalize if required
       var replacement = (cat.charAt(0) === 'C' ? 'D' : 'd') + 'og';
       if (char1 === ' ' && char2 === 's')
       {//replace plurals, too
           cat = replacement + 's';
       }
       else
       {//do not replace if dashes are matched
           cat = char1 === '-' || char2 === '-' ? cat : replacement;
       }
       return char1 + cat + char2;//return replacement string
    });
//returns:
//Two dogs are not 1 Dog! They're just cool-cats, you caterpillar

追加の興味深い部分を下部に配置する必要があると思います。ps .:ちょうど今、最初の行の半分が領域外にあることに気づきました、それを修正させてください!

69

グローバル正規表現と照合します。

anotherString = someString.replace(/cat/g, 'dog');


58

これらは、最も一般的で読みやすい方法です。

var str = "Test abc test test abc test test test abc test test abc"

方法1:

str = str.replace(/abc/g, "replaced text");

方法2:

str = str.split("abc").join("replaced text");

方法3:

str = str.replace(new RegExp("abc", "g"), "replaced text");

方法4:

while(str.includes("abc")){
    str = str.replace("abc", "replaced text");
}

出力:

console.log(str);
// Test replaced text test test replaced text test test test replaced text test test replaced text

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

または、ここからreplaceAll関数を試してください。

組み込みオブジェクトを拡張する便利なJavaScriptメソッドは何ですか?

str = str.replaceAll('abc', ''); OR

var search = 'abc';
str = str.replaceAll(search, '');

編集: replaceAllの可用性に関する説明

'replaceAll'メソッドがStringのプロトタイプに追加されます。つまり、すべての文字列オブジェクト/リテラル​​で使用できます。

例えば

var output = "test this".replaceAll('this', 'that');  //output is 'test that'.
output = output.replaceAll('that', 'this'); //output is 'test this'

2
プロトタイプを使用していない人のために、replaceAll()関数を書き直すことはできますか?
09

@Click Upvote ....プロトタイプを使用しています。これはすべてのJSオブジェクトの一部です。JSライブラリのprototype.jsを考えていると思います。
セス

セス、少し修正。プロトタイプにメソッドを追加すると、そのタイプのすべてのオブジェクトで使用できます。replceAllメソッドがStringプロトタイプに追加され、すべての文字列オブジェクトで機能するはずです。
SolutionYogi

@solutionyogi-はい、私は以前に(正しく)プロトタイプを使用しました。私は、Prototype.jsを意味すると想定した「プロトタイプを使用しない」についてのOPのコメントに対処しているだけでした(おそらく間違っていますか?)。JavaScriptオブジェクトにはプロトタイプがあると言っていたので、「プロトタイプ」と言ったほうがいいでしょう。したがって、「間接的な」方法ではあるものの、OPはすでに「プロトタイプを使用」していました。間接はここで使用するのは間違った用語かもしれませんが、私は非常に疲れています。
セス、

41

使用するRegExpにはJavaScriptを忘れないで、単にコードの下のような何かを、あなたのために仕事をすることができ/gためその傑出した後の世界

var str ="Test abc test test abc test test test abc test test abc";
str = str.replace(/abc/g, '');

再利用を考えている場合は、それを行う関数を作成しますが、これは1行の関数であるためお勧めできませんが、これを頻繁に使用する場合は、次のように書くことができます。

String.prototype.replaceAll = String.prototype.replaceAll || function(string, replaced) {
  return this.replace(new RegExp(string, 'g'), replaced);
};

以下のようにコードで繰り返し使用します。

var str ="Test abc test test abc test test test abc test test abc";
str = str.replaceAll('abc', '');

しかし、前に述べたように、書き込まれる行やパフォーマンスの点で大きな違いはありません。関数をキャッシュするだけで、長い文字列のパフォーマンスが向上し、再利用する場合はDRYコードの優れた方法になる場合があります。


40

すべての「abc」を「x」に置き換えたいとします。

let some_str = 'abc def def lom abc abc def'.split('abc').join('x')
console.log(some_str) //x def def lom x x def

文字列プロトタイプを変更するよりも簡単なことを考えていました。


1
シンプルで簡単、そしておそらく最もパフォーマンスの高いオプション:良い答え。
machineghost

実際、私はそれを個人的に測定していませんが、分割/結合は通常、非常にパフォーマンスの高いソリューションです。
machineghost 2017年



32

一重引用符を置き換える:

function JavaScriptEncode(text){
    text = text.replace(/'/g,'&apos;')
    // More encode here if required

    return text;
}

2
文字列を置き換えるために2行目をどのように変更できますか?これは機能しません:text = text.replace( 'hey'、 'hello'); 何か案が?
StefanĐorđević2016

2
確かにステファン、これがコードです... text = text.replace(/ hey / g、 'hello');
Chris Rosete

26

//出現回数が0になるまでループします。または、単にコピー/貼り付けします

    function replaceAll(find, replace, str) 
    {
      while( str.indexOf(find) > -1)
      {
        str = str.replace(find, replace);
      }
      return str;
    }

23
この方法は危険です。使用しないでください。置換文字列に検索キーワードが含まれている場合、無限ループが発生します。少なくとも、結果を.indexOf変数に格納し、この変数を.indexOf(キーワードのマイナスの長さと置換文字列の長さの合計)の2番目のパラメーターとして使用します。
Rob W

最初に検索パターンを奇妙なユニコード文字に置き換えることを考えています。そのため、入力文字列では使用されていません。プライベートエリアのU + E000のように。そして、それをターゲットに戻します。ここで作成しました。。それが良いアイデアかどうかはわかりません。
Lux、2014

26
str = str.replace(new RegExp("abc", 'g'), "");

上記の答えよりも私にとってはうまくいきました。したがって、テキスト()のnew RegExp("abc", 'g')すべての出現('g'フラグ)に一致するRegExpを作成します"abc"。2番目の部分は、空の文字列("")に置き換えられます。 strは文字列であり、オーバーライドではreplace(...)なく結果を返すだけなので、オーバーライドする必要があります。場合によっては、それを使用することもできます。


このコードスニペットが解決策となる場合もありますが、説明を含めると、投稿の品質を向上させるのに役立ちます。あなたは将来の読者のための質問に答えていることを覚えておいてください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません。
yivi 2017

ええ、あなたは正しいです。追加されました。また、元の質問に答えるために編集しました:)
csomakk

注:正規表現のgフラグは、すべての出現に一致するグローバルフラグであることを意味します
firstpostcommenter

25

これは、正規表現を使用しない最速のバージョンです。

jsperfの改訂

replaceAll = function(string, omit, place, prevstring) {
  if (prevstring && string === prevstring)
    return string;
  prevstring = string.replace(omit, place);
  return replaceAll(prevstring, omit, place, string)
}

分割して結合する方法のほぼ2倍の速度です。

あなたの場合は、ここでコメントに尖っているように、これは動作しませんomit変数が含まれているplaceのように、: replaceAll("string", "s", "ss")、常に単語の別の発生を置き換えることができるようになりますので。

私の再帰的置換のバリアントを持つ別のjsperfがさらに速くなります(http://jsperf.com/replace-all-vs-split-join/12)!

  • 2017年7月27日更新:最近リリースされたChrome 59の中で、RegExpのパフォーマンスが最も速いようです。

私はあなたの解決策を愛していました...私はあなたに+10を与えることができるといいのですが、これが私の+1です。置換された部分文字列のインデックスを保存し、より低いインデックスで一致が見つかった場合は次のジャンプにジャンプして、無限ループの問題を回避できると思います。テストしなかったので、パフォーマンスについてコメントすることはできませんが、これはこの優れた部分に対する私の2セントです。
Fr0zenFyr 2014

@ fr0zenfyr省略が行われているかどうかを確認したい場合(無限ループを防ぐため)if(place.replace(omit) === omit) {一致なしなどの条件を実行できるため、置換ループ} else {一致を使用しても安全なので、分割や結合などの別の方法を使用します}
Cole Lawrence

うーん..しかし、2つのソリューションを組み合わせるポイントは何ですか?私はとにかく、分割のファンではない/ ..アドバイスに感謝します。..とにかくアプローチに参加
Fr0zenFyr

@ Fr0zenFyr 2つのソリューションを組み合わせる目的は、高速な方法(ループが無限大になる場合など)を使用できない場合に、低速な方法にフォールバックすることだと思います。したがって、機能を効率よく確実に、しかし失敗の可能性をなくすことは、安全策です。
コールローレンス

@momomoどんな欠陥があるの?
SandRock

24

パフォーマンス

今日27.12.2019 選択したソリューションに対してmacOS v10.13.6(High Sierra)でテストを実行します。

結論

  • str.replace(/abc/g, '');Cは)すべての文字列のために良いクロスブラウザ高速なソリューションです。
  • split-joinA、B)またはreplaceC、D)に基づくソリューションは高速です
  • whileE、F、G、H)に基づくソリューションは遅い-小さな文字列では通常〜4倍遅く、長い​​文字列では約〜3000倍(!)遅い
  • 反復解(RA、RB)は遅く、長い​​文字列では機能しません

自分のソリューションも作成します。それは現在、質問の仕事をする最も短いもののようです:

str.split`abc`.join``

詳細

テストはChrome 79.0、Safari 13.0.4およびFirefox 71.0(64ビット)で実行されました。テストRARB再帰の使用。結果

ここに画像の説明を入力してください

短い文字列-55文字

ここでマシン上でテストを実行できます。Chromeの結果:

ここに画像の説明を入力してください

長い文字列:275,000文字

RARBが与える再帰的解

RangeError:呼び出しスタックの最大サイズを超えました

100万人のキャラクターの場合、彼らはChromeを壊す

ここに画像の説明を入力してください

他のソリューションで100万文字のテストを実行しようとしていますが、E、F、G、Hに非常に時間がかかるため、ブラウザーがスクリプトを中断するように求められるため、テスト文字列を275K文字に縮小します。ここでマシン上でテストを実行できます。Chromeの結果

ここに画像の説明を入力してください

テストで使用されるコード


1
これは詳細な答えの1つです!どうもありがとうございました!しかし、私が興味を持っているのは、 "new RegExp(...)"構文がそれほど多くの改善をもたらす理由です。
マークGergely Dolinka

21

検索したいものがすでに文字列内にあり、正規表現のエスケープ機能が手元にない場合は、join / splitを使用できます。

    function replaceMulti(haystack, needle, replacement)
    {
        return haystack.split(needle).join(replacement);
    }

    someString = 'the cat looks like a cat';
    console.log(replaceMulti(someString, 'cat', 'dog'));


ありがとう!このソリューションは私の問題に完全に対応します:)
xero399

19
function replaceAll(str, find, replace) {
  var i = str.indexOf(find);
  if (i > -1){
    str = str.replace(find, replace); 
    i = i + replace.length;
    var st2 = str.substring(i);
    if(st2.indexOf(find) > -1){
      str = str.substring(0,i) + replaceAll(st2, find, replace);
    }       
  }
  return str;
}

部分文字列がネイティブであるか、char配列をウォークスルーして新しい文字を作成するのがどれほどうまくいくのかと思います。
mmm 2017

16

私はこの方法が好きです(少しきれいに見えます):

text = text.replace(new RegExp("cat","g"), "dog"); 

1
さて、正規表現パターンとして使用するために文字列をどのようにエスケープしますか?
rakslice 2013年

わかりません。プレーンテキストに使用します
Owen

15

正規表現を使用せずにこれを行う最も簡単な方法は、次のコードのように分割して結合することです。

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



13

文字列にのような同様のパターンが含まれている場合、abcccこれを使用できます。

str.replace(/abc(\s|$)/g, "")

13

以前の答えはあまりにも複雑です。次のようなreplace関数を使用するだけです。

str.replace(/your_regex_pattern/g, replacement_string);

例:

var str = "Test abc test test abc test test test abc test test abc";

var res = str.replace(/[abc]+/g, "");

console.log(res);


10

探している文字列が置換後も存在しないことを確認する場合は、ループを使用する必要があります。

例えば:

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

完了すると、「テストabc」が残ります。

これを解決する最も簡単なループは次のとおりです。

var str = 'test aabcbc';
while (str != str.replace(/abc/g, '')){
   str.replace(/abc/g, '');
}

ただし、これにより、各サイクルで2回置換が実行されます。おそらく(投票される可能性があります)組み合わせると、少し効率がよくなりますが、読みにくい形式になります。

var str = 'test aabcbc';
while (str != (str = str.replace(/abc/g, ''))){}
// alert(str); alerts 'test '!

これは、重複する文字列を探すときに特に役立ちます。
たとえば、「a ,,, b」があり、重複するカンマをすべて削除したい場合などです。
[その場合、.replace(/、+ / g、 '、')を実行できますが、ある時点で、正規表現は複雑になり、代わりにループするほど遅くなります。]


10

人々は正規表現の使用に言及しましたが、テキストの大文字小文字に関係なくテキストを置き換えたい場合は、より良いアプローチがあります。大文字または小文字のように。以下の構文を使用

//Consider below example
originalString.replace(/stringToBeReplaced/gi, '');

//Output will be all the occurrences removed irrespective of casing.

ここで詳細な例を参照できます


サンプルサイトから:「/ toBeReplacedString / giは使用する必要がある正規表現です。ここで、gはグローバル一致を表し、iは大文字と小文字を区別し
ませ

8

以下の方法を簡単に使用できます

/**
 * Replace all the occerencess of $find by $replace in $originalString
 * @param  {originalString} input - Raw string.
 * @param  {find} input - Target key word or regex that need to be replaced.
 * @param  {replace} input - Replacement key word
 * @return {String}       Output string
 */
function replaceAll(originalString, find, replace) {
  return originalString.replace(new RegExp(find, 'g'), replace);
};

7

追加するだけ /g

document.body.innerHTML = document.body.innerHTML.replace('hello', 'hi');

// Replace 'hello' string with /hello/g regular expression.
document.body.innerHTML = document.body.innerHTML.replace(/hello/g, 'hi');

/g グローバルを意味します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.