Saya mencoba mengganti beberapa kata dalam sebuah string dengan banyak kata lain. Tali itu adalah "Saya punya kucing, anjing, dan seekor kambing."
Namun, ini tidak menghasilkan "Saya punya anjing, kambing, dan kucing", tetapi malah menghasilkan "Saya punya kucing, kucing, dan kucing". Apakah mungkin untuk mengganti beberapa string dengan beberapa string lainnya secara bersamaan dalam JavaScript, sehingga hasil yang benar akan dihasilkan?
var str = "I have a cat, a dog, and a goat.";
str = str.replace(/cat/gi, "dog");
str = str.replace(/dog/gi, "goat");
str = str.replace(/goat/gi, "cat");
//this produces "I have a cat, a cat, and a cat"
//but I wanted to produce the string "I have a dog, a goat, and a cat".
Jawaban:
Solusi spesifik
Anda dapat menggunakan fungsi untuk mengganti masing-masing.
contoh jsfiddle
Generalisasi itu
Jika Anda ingin mempertahankan regex secara dinamis dan menambahkan pertukaran di masa mendatang ke peta, Anda bisa melakukan ini
untuk menghasilkan regex. Jadi akan terlihat seperti ini
Dan untuk menambah atau mengubah penggantian lagi, Anda cukup mengedit peta.
biola dengan regex dinamis
Membuatnya dapat digunakan kembali
Jika Anda ingin ini menjadi pola umum, Anda bisa menariknya ke fungsi seperti ini
Jadi Anda bisa melewati str dan peta penggantian yang Anda inginkan ke fungsi dan itu akan mengembalikan string yang diubah.
bermain-main dengan fungsi
Untuk memastikan Object.keys berfungsi di browser lama, tambahkan mis polyfill dari MDN atau Es5 .
sumber
.
notasi dengan semua properti seperti itu. Notasi kurung berfungsi dengan string apa pun.map={'.': ',', ',': '.'}
dan regex/\.|,/g
.return mapObj[matched.toLowerCase()];
hanyareturn mapObj[matched];
karena saya menggunakan kasus tombol sensitif dimapObj
.Object.keys(mapObj).map(key => key.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')).join('|')
. Terinspirasi oleh jawaban iniIni mungkin tidak memenuhi kebutuhan persis Anda dalam contoh ini, tetapi saya telah menemukan ini cara yang berguna untuk mengganti beberapa parameter dalam string, sebagai solusi umum. Ini akan menggantikan semua instance parameter, tidak peduli berapa kali direferensikan:
Anda akan memohonnya sebagai berikut:
sumber
Gunakan item bernomor untuk mencegah penggantian lagi. misalnya
kemudian
Cara kerjanya: -% \ d + menemukan angka yang muncul setelah%. Kurung menangkap nomor tersebut.
Angka ini (sebagai string) adalah parameter ke-2, n, untuk fungsi lambda.
+ N-1 mengonversi string menjadi angka kemudian 1 dikurangi untuk mengindeks array binatang peliharaan.
Angka% kemudian diganti dengan string pada indeks array.
/ G menyebabkan fungsi lambda dipanggil berulang kali dengan setiap angka yang kemudian diganti dengan string dari array.
Dalam JavaScript modern: -
sumber
Ini bekerja untuk saya:
sumber
menggunakan Array.prototype.reduce () :
Contoh
sumber
${f}
alih-alih f untuk nilai akumulasi?${f}
.replace (new RegExp (Object.keys (s) [ 0], 'g'), s [Object.keys (s) [0]]), kalimat1) "Kalau-kalau ada orang yang bertanya-tanya mengapa solusi poster asli tidak berfungsi:
sumber
fungsi biasa pengguna untuk menentukan pola untuk mengganti dan kemudian menggunakan fungsi ganti untuk bekerja pada string input,
sumber
RegExp
objek tersebut dapat memecahkan masalahvar i = new RegExp('}','g'), j = new RegExp('{','g'), k = data.replace(i,'{').replace(j,'}');
Dengan paket ganti saya , Anda dapat melakukan hal berikut:
sumber
sumber
Anda dapat menemukan dan mengganti string menggunakan pembatas.
sumber
/ * replaceSome metode untuk string yang dibutuhkan, sebanyak argumen yang kita inginkan dan menggantikan semuanya dengan argumen terakhir yang kita tentukan 2013 CopyRights disimpan untuk: Max Ahmed ini adalah contoh:
* /
jsFiddle: http://jsfiddle.net/CPj89/
sumber
sumber
Saya menulis paket npm ini stringinject https://www.npmjs.com/package/stringinject yang memungkinkan Anda melakukan hal berikut
yang akan mengganti {0} dan {1} dengan item-item array dan mengembalikan string berikut
atau Anda bisa mengganti placeholder dengan kunci objek dan nilai seperti:
sumber
Anda dapat menggunakan https://www.npmjs.com/package/union-replacer untuk tujuan ini. Ini pada dasarnya adalah
string.replace(regexp, ...)
rekanan, yang memungkinkan beberapa penggantian terjadi dalam satu pass sekaligus mempertahankan kekuatan penuhstring.replace(...)
.Pengungkapan: Saya adalah penulis. Perpustakaan dikembangkan untuk mendukung penggantian yang dapat dikonfigurasi pengguna yang lebih kompleks dan menangani semua hal yang bermasalah seperti kelompok tangkap, referensi-kembali dan penggantian fungsi panggilan balik.
Solusi di atas cukup baik untuk penggantian string yang tepat.
sumber
Saya sedikit memperluas @BenMcCormicks. Dia bekerja untuk string reguler tetapi tidak jika saya melarikan diri karakter atau wildcard. Inilah yang saya lakukan
mengembalikan "bla bla 234433 bla bla"
Dengan cara ini akan cocok dengan kunci di mapObj dan bukan kata yang cocok '
sumber
Solusi dengan Jquery (pertama-tama sertakan file ini): Ganti banyak string dengan banyak string lainnya:
sumber
javascript tag added in question, and jquery is a libarary of javascript.
Hmmm bahwa logika tidak aktif, harus sebaliknya, dan juga hanya kepala - dari info tag javascript: " Kecuali tag lain untuk kerangka / pustaka juga disertakan, jawaban JavaScript murni diharapkan. "