Memperbarui:
Agak terlambat untuk pembaruan, tetapi karena saya baru saja menemukan pertanyaan ini, dan memperhatikan bahwa jawaban saya sebelumnya bukanlah jawaban yang saya sukai. Karena pertanyaan melibatkan penggantian satu kata, sungguh luar biasa tidak ada yang berpikir untuk menggunakan batas kata ( \b
)
'a cat is not a caterpillar'.replace(/\bcat\b/gi,'dog');
//"a dog is not a caterpillar"
Ini adalah regex sederhana yang menghindari penggantian bagian kata dalam kebanyakan kasus. Namun, tanda hubung -
masih dianggap sebagai batas kata. Jadi kondisional dapat digunakan dalam kasus ini untuk menghindari penggantian string seperti cool-cat
:
'a cat is not a cool-cat'.replace(/\bcat\b/gi,'dog');//wrong
//"a dog is not a cool-dog" -- nips
'a cat is not a cool-cat'.replace(/(?:\b([^-]))cat(?:\b([^-]))/gi,'$1dog$2');
//"a dog is not a cool-cat"
pada dasarnya, pertanyaan ini sama dengan pertanyaan di sini:
Javascript ganti "'" dengan "' '"
@ Mike, periksa jawaban yang saya berikan di sana ... regexp bukan satu-satunya cara untuk mengganti beberapa kemunculan subsrting, jauh dari itu. Berpikir fleksibel, pikirkan split!
var newText = "the cat looks like a cat".split('cat').join('dog');
Atau, untuk mencegah penggantian bagian kata - yang mana jawaban yang disetujui juga akan berlaku! Saya bisa mengatasi masalah ini menggunakan ekspresi reguler yang, saya akui, agak lebih kompleks dan sebagai hasilnya, sedikit lebih lambat, juga:
var regText = "the cat looks like a cat".replace(/(?:(^|[^a-z]))(([^a-z]*)(?=cat)cat)(?![a-z])/gi,"$1dog");
Outputnya sama dengan jawaban yang diterima, namun, menggunakan ekspresi / cat / g pada string ini:
var oops = 'the cat looks like a cat, not a caterpillar or coolcat'.replace(/cat/g,'dog');
//returns "the dog looks like a dog, not a dogerpillar or cooldog" ??
Ups memang, ini mungkin bukan yang Anda inginkan. Apa itu? IMHO, sebuah regex yang hanya menggantikan 'kucing' dengan persyaratan. (Yaitu bukan bagian dari kata), seperti:
var caterpillar = 'the cat looks like a cat, not a caterpillar or coolcat'.replace(/(?:(^|[^a-z]))(([^a-z]*)(?=cat)cat)(?![a-z])/gi,"$1dog");
//return "the dog looks like a dog, not a caterpillar or coolcat"
Dugaan saya adalah, ini memenuhi kebutuhan Anda. Tentu saja, ini tidak sepenuhnya tahan, tetapi itu sudah cukup untuk Anda memulainya. Saya sarankan membaca lebih banyak di halaman-halaman ini. Ini terbukti bermanfaat dalam menyempurnakan ungkapan ini untuk memenuhi kebutuhan spesifik Anda.
http://www.javascriptkit.com/jsref/regexp.shtml
http://www.regular-expressions.info
Penambahan akhir:
Mengingat bahwa pertanyaan ini masih mendapat banyak pandangan, saya pikir saya mungkin menambahkan contoh yang .replace
digunakan dengan fungsi panggilan balik. Dalam hal ini, ia secara dramatis menyederhanakan ekspresi dan bahkan memberikan lebih banyak fleksibilitas, seperti mengganti dengan huruf besar yang benar atau mengganti keduanya cat
dan cats
sekaligus:
'Two cats are not 1 Cat! They\'re just cool-cats, you caterpillar'
.replace(/(^|.\b)(cat)(s?\b.|$)/gi,function(all,char1,cat,char2)
{
//check 1st, capitalize if required
var replacement = (cat.charAt(0) === 'C' ? 'D' : 'd') + 'og';
if (char1 === ' ' && char2 === 's')
{//replace plurals, too
cat = replacement + 's';
}
else
{//do not replace if dashes are matched
cat = char1 === '-' || char2 === '-' ? cat : replacement;
}
return char1 + cat + char2;//return replacement string
});
//returns:
//Two dogs are not 1 Dog! They're just cool-cats, you caterpillar
aba
dalamababa
denganca
, yang mengakibatkan yang Anda harapkan?caba
?abca
?cca
?