ปรับปรุง:
มันค่อนข้างช้าสำหรับการอัปเดต แต่เนื่องจากฉันเพิ่งสะดุดกับคำถามนี้และสังเกตว่าคำตอบก่อนหน้านี้ไม่ใช่คำตอบที่ฉันมีความสุข เนื่องจากคำถามเกี่ยวข้องกับการแทนที่คำเดียวจึงไม่มีใครคิดที่จะใช้ขอบเขตคำ ( \b
)
'a cat is not a caterpillar'.replace(/\bcat\b/gi,'dog');
//"a dog is not a caterpillar"
นี่คือ regex ง่าย ๆ ที่หลีกเลี่ยงการแทนที่ส่วนของคำในกรณีส่วนใหญ่ อย่างไรก็ตามเส้นประ-
ยังถือว่าเป็นขอบเขตของคำ ดังนั้นเงื่อนไขสามารถใช้ในกรณีนี้เพื่อหลีกเลี่ยงการแทนที่สตริงเช่น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"
โดยพื้นฐานแล้วคำถามนี้เหมือนกับคำถามที่นี่:
Javascript แทนที่ "'" ด้วย "' '"
@ ไมค์ตรวจสอบคำตอบที่ฉันให้ไว้ที่นั่น ... regexp ไม่ใช่วิธีเดียวที่จะแทนที่การเกิดขึ้นหลายครั้งของการสมัครสมาชิก คิดว่ายืดหยุ่นคิดแยก!
var newText = "the cat looks like a cat".split('cat').join('dog');
อีกวิธีหนึ่งเพื่อป้องกันการแทนที่ส่วนคำ - ซึ่งคำตอบที่อนุมัติจะทำเช่นกัน! คุณสามารถแก้ไขปัญหานี้ได้โดยใช้นิพจน์ทั่วไปที่ฉันยอมรับว่ามีความซับซ้อนมากขึ้นและในที่สุดก็เป็นเรื่องที่ช้าลงเช่นกัน:
var regText = "the cat looks like a cat".replace(/(?:(^|[^a-z]))(([^a-z]*)(?=cat)cat)(?![a-z])/gi,"$1dog");
เอาต์พุตเหมือนกับคำตอบที่ยอมรับอย่างไรก็ตามการใช้นิพจน์ / cat / g บนสตริงนี้:
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" ??
โอ๊ะโอนี่อาจไม่ใช่สิ่งที่คุณต้องการ ถ้าเช่นนั้นอะไร IMHO, regex ที่แทนที่ 'cat' แบบมีเงื่อนไขเท่านั้น (เช่นไม่ใช่ส่วนหนึ่งของคำ) เช่น:
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"
ฉันเดาว่านี่คือสิ่งที่คุณต้องการ แน่นอนว่ามันไม่เต็มรูปแบบ แต่ก็น่าจะเพียงพอสำหรับคุณ ฉันขอแนะนำให้อ่านเพิ่มเติมในหน้าเหล่านี้ สิ่งนี้จะพิสูจน์ว่ามีประโยชน์ในการทำให้นิพจน์นี้สมบูรณ์แบบเพื่อตอบสนองความต้องการเฉพาะของคุณ
http://www.javascriptkit.com/jsref/regexp.shtml
http://www.regular-expressions.info
การเพิ่มครั้งสุดท้าย:
เนื่องจากคำถามนี้ยังคงได้รับความคิดเห็นจำนวนมากฉันคิดว่าฉันอาจเพิ่มตัวอย่างการ.replace
ใช้กับฟังก์ชันการโทรกลับ ในกรณีนี้มันทำให้การแสดงออกง่ายขึ้นและให้ความยืดหยุ่นมากขึ้นเช่นแทนที่ด้วยตัวพิมพ์ใหญ่ที่ถูกต้องหรือแทนที่ทั้งสองcat
และcats
ในครั้งเดียว:
'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
ในababa
ด้วยca
ซึ่งส่งผลให้คุณคาดหวัง?caba
?abca
?cca
?