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 /.../g
RegExp global ( ). Anda dapat melakukan ini dari string menggunakan new RegExp
konstruktor:
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.