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



Answers

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そのfind 、前処理なしで上記のfind関数で引数を渡すと、それらの文字をエスケープすることは危険です。 これは、 Mozilla Developer Network正規表現に関するJavaScriptガイドで説明されています 。ここでは、次のユーティリティ関数を示しています。

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

したがって、上記のreplaceAll()関数をより安全にするために、 replaceAll()もインクルードすると、次のように変更することができます:

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

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

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

行うこと

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

上の文字列でabcの最初の出現を取り除くだけのようです。 それをどのように置き換えることができますか?




私の実装、非常に自明

function replaceAll(string, token, newtoken) {
    if(token!=newtoken)
    while(string.indexOf(token) > -1) {
        string = string.replace(token, newtoken);
    }
    return string;
}






見つけたいものがすでに文字列に入っていて、正規表現のエスケープを手軽に利用できない場合は、join / splitを使うことができます:

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

someString = 'the cat looks like a cat';
anotherString = replaceMulti(someString, 'cat', 'dog');



//番号の出現数が0になるまで繰り返します。または単にコピー/ペーストします

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



あなたは単に以下の方法を使うことができます

/**
 * 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);
};



この2つの強力な方法を組み合わせることができます。

"test abc test test abc".split("abc").join("")

それが役に立てば幸い!




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

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




gフラグがセットされた正規表現を使用すると、すべてが置換されます。

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

こちらもご覧ください




更新:

更新にはいくらか遅れていますが、私はこの質問に偶然遭遇し、私の以前の答えは私が満足しているものではないことに気付きました。 質問には1つの単語を置き換えることが含まれていたので、単語境界( \b )を使用することは誰も考えられませんでした

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

これは、ほとんどの場合、単語の一部を置き換えることを避ける単純な正規表現です。 しかし、ダッシュはまだ単語の境界とみなされます。 この場合、 cool-catよう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 "" ""を "''"

@Mike、私がそこに与えた答えをチェックする... regexpは、そこから離れたサブレットの複数の出現を置き換える唯一の方法ではありません。 柔軟性を考え、分裂を考えよう!

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は条件付きで 'cat'を置き換える正規表現です。 (つまり、単語の一部ではない)

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例を追加するかもしれないと思った。 この場合、表現劇的に簡素化し、適切な大文字と置き換えたり、 catcats両方を一度に置き換えるなど、さらに柔軟性提供します。

'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



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'



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

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



正規表現を使用する:

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



次の機能が私の仕事です:

String.prototype.replaceAllOccurence = function(str1, str2, ignore) 
{
    return this.replace(new RegExp(str1.replace(/([\/\,\!\\\^\$\{\}\[\]\(\)\.\*\+\?\|\<\>\-\&])/g,"\\$&"),(ignore?"gi":"g")),(typeof(str2)=="string")?str2.replace(/\$/g,"$$$$"):str2);
} ;

次のような関数を呼び出します。

"you could be a Project Manager someday, if you work like this.".replaceAllOccurence ("you", "I");

このコードをブラウザコンソールにコピーして、TESTに貼り付けるだけです。




私は以前の再帰置換の結果を格納するためにpを使います:

function replaceAll(s, m, r, p) {
    return s === p || r.contains(m) ? s : replaceAll(s.replace(m, r), m, r, s);
}

可能な限り、文字列s内のすべての文字列を置換します。

replaceAll('abbbbb', 'ab', 'a') → 'abbbb' → 'abbb' → 'abb' → 'ab' → 'a'

無限ループを回避するために、置換rに一致mが含まれているかどうかをチェックします。

replaceAll('abbbbb', 'a', 'ab') → 'abbbbb'





Links