更新:
更新有点晚了,但是因为我只是偶然发现了这个问题,并注意到我之前的答案不是我满意的答案。由于问题涉及替换单个单词,令人难以置信的是没有人想到使用单词边界 (\b)
'a cat is not a caterpillar'.replace(/\bcat\b/gi,'dog');
//"a dog is not a caterpillar"
这是一个简单的正则表达式,可以避免在大多数情况下替换部分单词。但是,破折号- 仍被视为单词边界。所以在这种情况下可以使用条件来避免替换像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 replace " ' " with " '' "
@Mike,检查我在那里给出的答案... regexp 不是替换多次出现的 subsrting 的唯一方法,远非如此。思考灵活,思考分裂!
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" ??
糟糕,这可能不是您想要的。那是什么?恕我直言,一个仅有条件地替换“猫”的正则表达式。 (即不是单词的一部分),像这样:
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