1回の置換呼び出しで複数の文字を置換する


257

非常に単純な小さな質問ですが、どうすればいいのかよくわかりません。

「_」のすべてのインスタンスをスペースに、「#」のすべてのインスタンスを何もない/空のに置き換える必要があります。

var string = '#Please send_an_information_pack_to_the_following_address:';

私はこれを試しました:

string.replace('#','').replace('_', ' ');

このようなコマンドのチェーンはあまり好きではありません。1つでそれを行う別の方法はありますか?


:この質問への答えを参照してください stackoverflow.com/questions/7072330/...
DeweyOx

回答:


515

OR演算子(|)を使用します。

var str = '#this #is__ __#a test###__';
str.replace(/#|_/g,''); // result: "this is a test"

文字クラスを使用することもできます:

str.replace(/[#_]/g,'');

フィドル

ハッシュとアンダースコアを別のものに置き換える場合は、チェーンする必要があります。ただし、プロトタイプを追加することもできます。

String.prototype.allReplace = function(obj) {
    var retStr = this;
    for (var x in obj) {
        retStr = retStr.replace(new RegExp(x, 'g'), obj[x]);
    }
    return retStr;
};

console.log('aabbaabbcc'.allReplace({'a': 'h', 'b': 'o'}));
// console.log 'hhoohhoocc';

しかし、なぜチェーンしないのですか?私はそれで何も悪いとは思わない。


これはクールですが、アンダースコアを空ではないスペースに置き換える必要があります。これはできますか?
Shannon Hochkins 2013年

そう思いましたが、それでも、置換式が少し良く機能する方法を理解するのを助けてくれました:)
Shannon Hochkins 2013年

プロトタイプが機能しませんか?フィドルの例を提供できますか?エラーが発生し続けます
Shannon Hochkins 2013年

3
のもう1つのオプション#|_[#_]、であり、+パフォーマンスを向上させるために連続した一致と一致させるために使用することもできます
Ian

3
クールな感謝...必要に応じて空白スペースを置き換え、別の記号はstr.replace(/[+ -]/g,'');真ん中に空白スペースを置くだけです。
2016

53

連鎖はクールです、なぜそれを却下するのですか?

とにかく、これは1つの置換の別のオプションです。

string.replace(/#|_/g,function(match) {return (match=="#")?"":" ";})

置換では、match == "#"の場合は ""、そうでない場合は ""が選択されます。

[更新]より一般的な解決策として、置換文字列をオブジェクトに保存できます:

var replaceChars={ "#":"" , "_":" " };
string.replace(/#|_/g,function(match) {return replaceChars[match];})

4
追加の手順を実行します。var regex = new RegExp( Object.keys(replaceChars).join("|"), "g"); string.replace(regex,function(match) {return replaceChars[match];})これにより、replaceCharの変更が容易になります。
RozzA 2016

@RozzAありがとう。当時、Object.keysは主流ではありませんでした。
クリストフ

覚え
やすく

48

複数の文字を置き換える場合String.prototype.replace()は、置換引数を使用してを呼び出すことができます。引数は、一致ごとに呼び出される関数です。必要なのは、その関数で使用する文字マッピングを表すオブジェクトだけです。

あなたがしたい場合たとえば、aと置き換えxbycしてz、あなたはこのような何かを行うことができます。

var chars = {'a':'x','b':'y','c':'z'};
var s = '234abc567bbbbac';
s = s.replace(/[abc]/g, m => chars[m]);
console.log(s);

出力234xyz567yyyyxz


3
ES6(矢印関数)を使用しているのでvarconstここでも置き換える必要があります。拡張ブラウザーサポートの代替手段:var s ='234abc567bbbbac'; s = s.replace(/[abc]/g, function(m) { return {'a':'x','b':'y','c':'z'}[m]; }); console.log(s);
Felix Geenen 2018年

1
@FelixGeenen 1.移植性を殺す2. charsまたはsを再定義することを選択した場合、実行時エラーが発生し、その堅牢性が失われます。:それはこのスニペットはまだダブルクリック/します。cscript /のWScriptにインストールしたばかりのWindows98で動作することを確認するために素晴らしいことだvar chars = {a:'1', b:'2', c:'3'}; var s = '123abc123'; var u = s.replace(/[abc]/g, function(m) { return chars[m]; }); WScript.echo(u);
ドミトリー

これは本当に良いです。ありがとう。オブジェクトを使用してorステートメントを実行した部分は何ですか。それを説明するドキュメントまたは参照があるか。かなり良いユースケース。
クリスチャンマシュー

39

/g正規表現で(グローバル)フラグを指定して、最初のものだけでなくすべての一致を置き換えます。

string.replace(/_/g, ' ').replace(/#/g, '')

ある文字を別のものに置き換え、別の文字を別のものに置き換えるには、実際にを2回呼び出す必要はありませんreplace。Doorknobが行ったように、それを関数に抽象化できますが、おそらく、フラット配列の代わりに、キー/値のペアとしてold / newを持つオブジェクトを取得します。


ハッシュも含めますか?
Shannon Hochkins 2013年

4

これを試すこともできます:

function replaceStr(str, find, replace) {
    for (var i = 0; i < find.length; i++) {
        str = str.replace(new RegExp(find[i], 'gi'), replace[i]);
    }
    return str;
}

var text = "#here_is_the_one#";
var find = ["#","_"];
var replace = ['',' '];
text = replaceStr(text, find, replace);
console.log(text);

find 検索するテキストを参照し、 replaceされるテキストと置換されるテキストを参照します

これは、大文字と小文字を区別しない文字を置き換えます。それ以外の場合は、必要に応じてRegexフラグを変更するだけです。例:大文字と小文字を区別する置換の場合:

new RegExp(find[i], 'g')

4

あなたはこれを試すことができます:

str.replace(/[.#]/g, 'replacechar');

これにより、。、-、および#がreplacecharに置き換えられます。


この回答はすでに提供されており、異なる文字を他の文字に置き換えることはできません。OPを参照してください。
Shannon Hochkins 2016

3

RegExなしでこれを行う簡単な方法を次に示します。
必要に応じて、プロトタイプやキャッシュを作成できます。

// Example: translate( 'faded', 'abcdef', '123456' ) returns '61454'
function translate( s, sFrom, sTo ){
    for ( var out = '', i = 0; i < s.length; i++ ){
        out += sTo.charAt( sFrom.indexOf( s.charAt(i) ));
    }
    return out;
}

あなたがそれを述べなかったのは知っていますが、正規表現を使用する方がはるかにエレガントではありませんか?str.replace(/#|_/g,'')
Shannon Hochkins、2015年

1
@ShannonHochkins確かに!RegExでバッシングするつもりはありません。別のオプションを表示しています。RegExは常に直感的であるとは限らず、「ハンマーとして、すべての問題を釘として扱う」ことに使用できます。さらに、他の答えを見ると、再利用可能な関数として、これはそれほど長くはなく、パラメーターは理解しやすいです。個人的には、ここでの質問には短いRegExを使用します。完全に理解しなくてもかまわないクイックドロップインスニペットを探しているだけの場合は理にかなっています。
Beejor

まあ、あなたが翻訳する必要がある場合文字する(àla sed yコマンドまたはàla Unix tr)、これは正しい答えのようです。
エドゥアール2016年

3

してみてください:

  • 複数の文字列を置き換える

    var str = "http://www.abc.xyz.com"; str = str.replace(/http:|www|.com/g, ''); //str is "//.abc.xyz"

  • 複数の文字を置き換える

    var str = "a.b.c.d,e,f,g,h"; str = str.replace(/[.,]/g, ''); //str is "abcdefgh";

幸運を!


2

RegExpオブジェクトをreplaceメソッドに渡すこともできます

var regexUnderscore = new RegExp("_", "g"); //indicates global match
var regexHash = new RegExp("#", "g");

string.replace(regexHash, "").replace(regexUnderscore, " ");

Javascript RegExp


OPはreplace呼び出しをチェーンしたくありません-これはそれを回避するのに役立ちません。
デニス

2

yourstring = '#Please send_an_information_pack_to_the_following_address:';

「#」を「」に置き換え、「_」をスペースに置き換えます

var newstring1 = yourstring.split('#').join('');
var newstring2 = newstring1.split('_').join(' ');

newstring2が結果です


あなたの答えはjQueryの断片を使用せず、OPにも従いません。 '#this #is__ #a test ### ' .split( '_')。join( '')は、余白が増えることになります
Shannon Hochkins 2017年

@ShannonHochkins空白はさらに追加されますか?
Hafsul Maru 2017

スペースの前にアンダースコアがあるか、2つのアンダースコアが複数のスペースになってしまう場合、私の例を見てください。
Shannon Hochkins 2017

@ShannonHochkins質問者は文字列 '#Please send_an_information_pack_to_the_following_address:';を処理します。ここにはスペースがありません。なぜ私はそれを考えるでしょう。考えるとき、なぜ宇宙だけなのか、他にも多くのことが起こります。
Hafsul Maru 2018

OPを再読することをお勧めします。私は元のポスターです。最初の変数var str = '#this #is__ __#a test###__';で、この文字列に明らかに複数のスペースがあることがわかります。
Shannon Hochkins、2018

2

これは文字列プロトタイプを使用した別のバージョンです。楽しい!

String.prototype.replaceAll = function(obj) {
    let finalString = '';
    let word = this;
    for (let each of word){
        for (const o in obj){
            const value = obj[o];
            if (each == o){
                each = value;
            }
        }
        finalString += each;
    }

    return finalString;
};

'abc'.replaceAll({'a':'x', 'b':'y'}); //"xyc"

1

これでどれだけ効果があるかはわかりませんが、削除<b>したいと思います。</b>、文字列から思いました

だから私は使った

mystring.replace('<b>',' ').replace('</b>','');

したがって、基本的には、限られた数のキャラクターを減らして時間を無駄にしたくない場合に役立ちます。


-1

以下は、「reduce」複数置換関数を使用した「安全なHTML」関数です(この関数は、各置換を文字列全体に適用するため、置換間の依存関係が重要です)。

// Test:
document.write(SafeHTML('<div>\n\
    x</div>'));

function SafeHTML(str)
    {
    const replacements = [
        {'&':'&amp;'},
        {'<':'&lt;'},
        {'>':'&gt;'},
        {'"':'&quot;'},
        {"'":'&apos;'},
        {'`':'&grave;'},
        {'\n':'<br>'},
        {' ':'&nbsp;'}
        ];
    return replaceManyStr(replacements,str);
    } // HTMLToSafeHTML

function replaceManyStr(replacements,str)
    {
    return replacements.reduce((accum,t) => accum.replace(new RegExp(Object.keys(t)[0],'g'),t[Object.keys(t)[0]]),str);
    }

投稿ありがとうございます。ただし、承認された回答と比較するとかなり広範囲です
Shannon Hochkins '

質問に対する答えは、1行の関数です。それはどのように「広範囲」ですか?ユーザー入力を安全にすることは重要な例です。あなたはあまりにも批判的です。'reduce'は、知っておくべき非常に便利なテクニックです。
David Spector

私はあなたの答えが広すぎると言った、それははるかに多くのコードであり、とにかく正規表現を使用している、プロセスを複雑にしすぎている、あなたの答えがこれらの答えのどれよりも削減であるとどう思うかわからない...
シャノンホホキンス

Array.prototype.reduce関数を使用しているため、私の回答は「還元」の回答です。より短い答えは、プロパティキーの代わりに文字列を使用する可能性があり、「安全なHTML」関数が単一の文字を置き換える場合にのみ機能するという事実を利用します。このように人前で失礼な文句を言うのではなく、よりエレガントな答えを考え出してください。
デビッドスペクター

実際、私はありがとうと言って、あなたに批判を与えました、あなたはそれを取り、私たちが本来の
Shannon Hochkins
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.