Ganti beberapa karakter dalam satu panggilan ganti

257

Pertanyaan kecil yang sangat sederhana, tetapi saya tidak mengerti bagaimana melakukannya.

Saya perlu mengganti setiap instance '_' dengan spasi, dan setiap instance dari '#' dengan tidak ada / kosong.

var string = '#Please send_an_information_pack_to_the_following_address:';

Saya sudah mencoba ini:

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

Saya tidak begitu suka perintah chaining seperti ini. Apakah ada cara lain untuk melakukannya dalam satu?

Shannon Hochkins
sumber
Lihat jawaban untuk pertanyaan ini: stackoverflow.com/questions/7072330/…
DeweyOx

Jawaban:

516

Gunakan operator ATAU ( |):

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

Anda juga bisa menggunakan kelas karakter:

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

Biola

Jika Anda ingin mengganti hash dengan satu hal dan garis bawah dengan yang lain, maka Anda hanya perlu rantai. Namun, Anda dapat menambahkan prototipe:

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';

Tapi mengapa tidak berantai? Saya tidak melihat ada yang salah dengan itu.

tckmn
sumber
Ini keren, tetapi saya perlu mengganti garis bawah dengan spasi yang tidak kosong, dapatkah saya melakukan ini?
Shannon Hochkins
Kupikir begitu, tapi tetap saja kau membantuku memahami bagaimana cara mengganti ekspresi bekerja sedikit lebih baik :)
Shannon Hochkins
Prototipe Anda tidak berfungsi? apakah Anda dapat memberikan contoh tentang biola, saya terus mendapatkan kesalahan
Shannon Hochkins
3
Pilihan lain #|_adalah [#_], dan Anda mungkin juga menggunakan +untuk mencocokkan setiap pertandingan berturut-turut untuk meningkatkan kinerja
Ian
3
Keren terima kasih ... jika perlu ganti spasi kosong dan simbol lain str.replace(/[+ -]/g,'');cukup masukkan ruang kosong di tengah.
equiman
53

Rantai itu keren, mengapa menolaknya?

Bagaimanapun, berikut adalah opsi lain dalam satu penggantian:

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

Pengganti akan memilih "" jika cocok == "#", "" jika tidak.

[Perbarui] Untuk solusi yang lebih umum, Anda dapat menyimpan string pengganti di suatu objek:

var replaceChars={ "#":"" , "_":" " };
string.replace(/#|_/g,function(match) {return replaceChars[match];})
Christophe
sumber
4
ambil langkah ekstra: var regex = new RegExp( Object.keys(replaceChars).join("|"), "g"); string.replace(regex,function(match) {return replaceChars[match];})ini membuat memodifikasi replaceChars lebih mudah.
RozzA
@Rozz, terima kasih. Object.keys bukan arus utama pada saat itu.
Christophe
Saya benar-benar lupa tentang opsi fungsi penggantian untuk mengganti parameter kedua, untuk membantu saya mengingat :)
Luckylooke
48

Jika Anda ingin mengganti beberapa karakter, Anda dapat memanggil String.prototype.replace()dengan argumen penggantian sebagai fungsi yang dipanggil untuk setiap pertandingan. Yang Anda butuhkan adalah objek yang mewakili pemetaan karakter yang akan Anda gunakan dalam fungsi itu.

Misalnya, jika Anda ingin adiganti dengan x, bdengan ydan cdengan z, Anda dapat melakukan sesuatu seperti ini:

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

Output :234xyz567yyyyxz

Voicu
sumber
3
karena Anda menggunakan ES6 (fungsi panah) Anda juga harus menggantinya vardengan di constsini. alternatif untuk dukungan browser yang diperluas:var s ='234abc567bbbbac'; s = s.replace(/[abc]/g, function(m) { return {'a':'x','b':'y','c':'z'}[m]; }); console.log(s);
Felix Geenen
1
@FelixGeenen 1. Anda membunuh portabilitas 2. jika Anda memilih untuk mendefinisikan kembali karakter atau karakter, Anda akan mendapatkan kesalahan runtime, yang membunuh kekuatannya, 3. tidak ada jaminan untuk melindungi huruf s dari mutasi dan pemberontakan selain yang ideologis murni. Merupakan hal yang luar biasa untuk melihat bahwa cuplikan ini akan tetap berfungsi di windows98 yang baru diinstal pada klik ganda / cscript / wscript: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);
Dmitry
ini sangat bagus. Terima kasih. Apa bagian di mana Anda menggunakan objek untuk melakukan atau pernyataan. apakah Anda memiliki dokumentasi atau referensi ke sesuatu yang menjelaskan hal itu. Kasus penggunaan cukup bagus.
Christian Matthew
39

Tentukan /gbendera (global) pada ekspresi reguler untuk mengganti semua kecocokan, bukan hanya yang pertama:

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

Untuk mengganti satu karakter dengan satu hal dan karakter yang berbeda dengan yang lain, Anda tidak bisa benar-benar membutuhkan dua panggilan terpisah replace. Anda dapat mengabstraksikannya menjadi fungsi seperti yang dilakukan Doorknob, meskipun saya mungkin akan mengambilnya dengan objek yang lama / baru sebagai pasangan kunci / nilai alih-alih array datar.

Mark Reed
sumber
bagaimana saya memasukkan hash juga?
Shannon Hochkins
4

Anda juga dapat mencoba ini:

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

findmengacu pada teks yang akan ditemukan dan replaceteks yang akan diganti

Ini akan menggantikan karakter tidak sensitif huruf besar / kecil. Untuk melakukan cara lain, ubah saja bendera Regex sesuai kebutuhan. Misalnya: ganti case sensitif:

new RegExp(find[i], 'g')
Tapan Bala
sumber
4

Anda bisa mencoba ini:

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

ini akan menggantikan., - dan # dengan replacechar Anda!

karim somai
sumber
Jawaban ini telah disediakan dan tidak menangani penggantian karakter yang berbeda dengan karakter lain, lihat OP.
Shannon Hochkins
3

Berikut cara mudah untuk melakukannya tanpa RegEx.
Anda dapat membuat prototipe dan / atau menyimpan sesuatu seperti yang diinginkan.

// 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;
}
Beejor
sumber
Saya tahu Anda tidak menyatakannya, tetapi bukankah jauh lebih elegan untuk hanya menggunakan regex? str.replace(/#|_/g,'')
Shannon Hochkins
1
@ShannonHochkins Pasti! Saya tidak bermaksud melakukan bash pada RegEx; Saya hanya menunjukkan opsi lain. RegEx tidak selalu intuitif dan cocok untuk digunakan "sebagai palu, memperlakukan setiap masalah sebagai paku". Plus melihat jawaban lain, sebagai fungsi yang dapat digunakan kembali yang satu ini tidak lebih panjang, dan parameternya mudah dimengerti. Secara pribadi saya akan menggunakan RegEx singkat untuk pertanyaan di sini, dan masuk akal jika Anda hanya mencari potongan cepat yang tidak Anda tidak mengerti sepenuhnya.
Beejor
Nah, jika Anda perlu menerjemahkan karakter ( perintah à la sed y atau à la Unix tr), ini sepertinya jawaban yang tepat.
Édouard
3

Silakan coba:

  • ganti multi-string

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

  • ganti multi karakter

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

Semoga berhasil!

Tran Hung
sumber
2

Anda juga dapat mengirimkan objek RegExp ke metode ganti seperti

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

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

Javascript RegExp

Michael Sanchez
sumber
OP tidak ingin membuat replacepanggilan - ini tidak membantu menghindarinya.
Dennis
2

yourstring = '#Please send_an_information_pack_to_the_following_address:';

ganti '#' dengan '' dan ganti '_' dengan spasi

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

newstring2 adalah hasil Anda

Hafsul Maru
sumber
Jawaban Anda tidak menggunakan sedikit pun jQuery, dan juga tidak mengikuti OP, '#ini #ad__ #a tes ### ' .split ('_') .gabung ('_') .gabung ('') tidak akan berfungsi sebagai Anda akan berakhir dengan ruang putih yang lebih banyak
Shannon Hochkins
@ShannonHochkins Berapa banyak ruang putih yang akan ditambahkan?
Hafsul Maru
Lihatlah contoh saya, ketika ada garis bawah sebelum spasi, atau dua garis bawah Anda akan berakhir dengan beberapa spasi.
Shannon Hochkins
@ShannonHochkins si penanya berurusan dengan string '#Silakan kirimkan_an_informasi_pack_to_the_following_address:'; tidak ada ruang di sini. mengapa saya akan memikirkannya. ketika berpikir, mengapa hanya tentang ruang, banyak hal lain dapat terjadi.
Hafsul Maru
Saya sarankan Anda membaca OP, saya poster asli dan Anda dapat melihat dengan jelas dalam variabel pertama saya var str = '#this #is__ __#a test###__';bahwa ada beberapa ruang kosong dalam string ini.
Shannon Hochkins
2

Ini adalah versi lain yang menggunakan String Prototype. Nikmati!

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"
Diego Fortes
sumber
1

Saya tidak tahu apakah ini akan membantu tetapi saya ingin menghapus <b>dan</b> dari string saya

jadi saya menggunakan

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

jadi pada dasarnya jika Anda ingin mengurangi jumlah karakter dan jangan buang waktu, ini akan berguna.

Hrishikesh Kale
sumber
-1

Berikut ini adalah fungsi "HTML aman" menggunakan fungsi beberapa pengganti 'perkecil' (fungsi ini berlaku untuk setiap penggantian pada seluruh string, sehingga ketergantungan antar penggantian menjadi signifikan).

// 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);
    }
David Spector
sumber
Terima kasih atas posnya, namun cukup luas dibandingkan dengan jawaban yang diterima
Shannon Hochkins
Jawaban atas pertanyaan adalah fungsi satu baris. Bagaimana itu "luas"? Membuat input pengguna aman adalah contoh penting. Kamu terlalu kritis. 'Mengurangi' adalah teknik yang sangat berguna yang harus Anda ketahui.
David Spector
Saya katakan jawaban Anda terlalu luas, lebih banyak kode, Anda menggunakan ekspresi reguler, hanya membuat prosesnya terlalu berbelit-belit, tidak yakin bagaimana menurut Anda jawaban Anda pengurangan dibandingkan dengan salah satu dari jawaban ini ...
Shannon Hochkins
Jawaban saya adalah jawaban 'kurangi' karena menggunakan fungsi Array.prototype.reduce. Jawaban yang lebih pendek mungkin menggunakan string alih-alih kunci properti, mengeksploitasi fakta bahwa fungsi "HTML aman" hanya berfungsi pada penggantian karakter tunggal. Saya menantang Anda untuk memberikan jawaban yang lebih elegan daripada mengeluh dengan kasar di depan umum seperti ini.
David Spector
Sebenarnya saya mengucapkan terima kasih, dan memberi Anda kritik, Anda mengambilnya dan memutuskan untuk menulis sesuatu yang aneh kembali, jika kita akan mulai dengan metode fungsional untuk melakukan daripada metode dirantai prototipikal seperti yang seharusnya, maka sesuatu yang lebih sederhana seperti: jsfiddle .net / shannonhochkins / xsm9j610 / 21
Shannon Hochkins