Atualizar:
É um pouco tarde para uma atualização, mas desde que acabei de me deparar com essa pergunta e percebi que minha resposta anterior não é com a qual estou feliz. Como a pergunta envolvia substituir uma única palavra, é incrível que ninguém pensasse em usar limites de palavras ( \b
)
'a cat is not a caterpillar'.replace(/\bcat\b/gi,'dog');
//"a dog is not a caterpillar"
Esse é um regex simples que evita substituir partes das palavras na maioria dos casos. No entanto, um traço -
ainda é considerado um limite de palavra. Portanto, condicionais podem ser usados neste caso para evitar a substituição de strings como 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"
basicamente, esta pergunta é a mesma que a pergunta aqui:
Javascript substitui "'" por "' '"
@ Mike, verifique a resposta que eu dei lá ... regexp não é a única maneira de substituir várias ocorrências de uma assinatura, longe disso. Pense flexível, pense dividido!
var newText = "the cat looks like a cat".split('cat').join('dog');
Como alternativa, para evitar a substituição de partes de palavras, o que a resposta aprovada também fará! Você pode contornar esse problema usando expressões regulares que são, eu admito, um pouco mais complexas e, como resultado disso, um pouco mais devagar:
var regText = "the cat looks like a cat".replace(/(?:(^|[^a-z]))(([^a-z]*)(?=cat)cat)(?![a-z])/gi,"$1dog");
A saída é igual à resposta aceita, no entanto, usando a expressão / cat / g nesta cadeia de caracteres:
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" ??
Opa, de fato, isso provavelmente não é o que você deseja. O que é então? IMHO, um regex que substitui apenas 'gato' condicionalmente. (ou seja, não faz parte de uma palavra), assim:
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"
Meu palpite é que isso atenda às suas necessidades. Não é à prova de falhas, é claro, mas deve ser suficiente para você começar. Eu recomendo ler um pouco mais sobre estas páginas. Isso será útil para aperfeiçoar essa expressão para atender às suas necessidades específicas.
http://www.javascriptkit.com/jsref/regexp.shtml
http://www.regular-expressions.info
Adição final:
Como essa pergunta ainda tem muitas visualizações, pensei em adicionar um exemplo de .replace
usado com uma função de retorno de chamada. Neste caso, ele simplifica dramaticamente a expressão e oferece ainda mais flexibilidade, como a substituição com capitalização correta ou substituição de ambos cat
e cats
de uma só vez:
'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
inababa
porca
, qual resultado você espera?caba
?abca
?cca
?