Dengan literal string, ini cukup mudah.
Tidak juga! Contoh tersebut hanya menggantikan kemunculan pertamastring_to_replace . Lebih umum Anda ingin mengganti semua kejadian, dalam hal ini, Anda harus mengubah string menjadi /.../gRegExp global ( ). Anda dapat melakukan ini dari string menggunakan new RegExpkonstruktor:
new RegExp(string_to_replace, 'g')
Masalah dengan ini adalah bahwa karakter khusus-regex dalam string literal akan berperilaku dengan cara khusus mereka alih-alih menjadi karakter normal. Anda harus melakukan backslash-escape untuk memperbaikinya. Sayangnya, tidak ada fungsi bawaan untuk melakukan ini untuk Anda, jadi inilah yang dapat Anda gunakan:
function escapeRegExp(s) {
return s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')
}
Perhatikan juga bahwa saat Anda menggunakan RegExp di replace(), string pengganti sekarang memiliki karakter khusus juga $,. Ini juga harus di-escape jika Anda ingin memiliki literal $dalam teks pengganti Anda!
function escapeSubstitute(s) {
return s.replace(/\$/g, '$$$$');
}
(Empat $d karena itu sendiri adalah string pengganti — argh!)
Sekarang Anda dapat mengimplementasikan penggantian string global dengan RegExp:
function replace_foo(target, string_to_replace, replacement) {
var relit= escapeRegExp(string_to_replace);
var sub= escapeSubstitute(replacement);
var re= new RegExp(relit, 'g');
return target.replace(re, sub);
}
Sakit sekali. Untungnya jika yang ingin Anda lakukan hanyalah mengganti string lurus tanpa bagian regex tambahan, ada cara yang lebih cepat:
s.split(string_to_replace).join(replacement)
... dan itu saja. Ini adalah idiom yang umum dipahami.
katakanlah saya ingin mengganti semuanya kecuali string_to_replace
Apa artinya, Anda ingin mengganti semua hamparan teks yang tidak mengambil bagian dalam pertandingan melawan string? Pengganti dengan ^pasti bukan ini, karena ^berarti token awal string, bukan negasi. ^hanya negasi dalam []kelompok karakter. Ada juga lookaheads negatif (?!...), tetapi ada masalah dengan itu di JScript jadi sebaiknya Anda menghindarinya.
Anda dapat mencoba mencocokkan 'semuanya hingga' string, dan menggunakan fungsi untuk membuang peregangan kosong di antara string yang cocok:
var re= new RegExp('(.*)($|'+escapeRegExp(string_to_find)+')')
return target.replace(re, function(match) {
return match[1]===''? match[2] : replacement+match[2];
});
Di sini, sekali lagi, pemisahan mungkin lebih sederhana:
var parts= target.split(string_to_match);
for (var i= parts.length; i-->0;)
if (parts[i]!=='')
parts[i]= replacement;
return parts.join(string_to_match);
/pemisah ekspresi reguler saat menggunakan formulir ini juga.