Aggiornare:
È un po 'tardi per un aggiornamento, ma dal momento che mi sono appena imbattuto in questa domanda e ho notato che la mia risposta precedente non è soddisfacente. Poiché la domanda riguardava la sostituzione di una sola parola, è incredibile che nessuno abbia pensato di usare i confini delle parole ( \b
)
'a cat is not a caterpillar'.replace(/\bcat\b/gi,'dog');
//"a dog is not a caterpillar"
Questo è un regex semplice che nella maggior parte dei casi evita di sostituire parti di parole. Tuttavia, un trattino -
è ancora considerato un limite di parole. Quindi i condizionali possono essere usati in questo caso per evitare di sostituire stringhe come 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"
fondamentalmente, questa domanda è la stessa della domanda qui:
Javascript sostituisce "'" con "' '"
@ Mike, controlla la risposta che ho dato lì ... regexp non è l'unico modo per sostituire più occorrenze di un abbonamento, tutt'altro. Pensa flessibile, pensa diviso!
var newText = "the cat looks like a cat".split('cat').join('dog');
In alternativa, per impedire la sostituzione di parti di parole, cosa che farà anche la risposta approvata! Puoi aggirare questo problema usando espressioni regolari che, ammetto, sono un po 'più complesse e, come risultato, anche un po' più lente:
var regText = "the cat looks like a cat".replace(/(?:(^|[^a-z]))(([^a-z]*)(?=cat)cat)(?![a-z])/gi,"$1dog");
L'output è uguale alla risposta accettata, tuttavia, usando l'espressione / cat / g su questa stringa:
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" ??
Oops, questo probabilmente non è quello che vuoi. Cos'è allora? IMHO, una regex che sostituisce solo "gatto" in modo condizionale. (cioè non fa parte di una parola), in questo modo:
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"
Suppongo che questo soddisfi le tue esigenze. Ovviamente non è completamente impermeabile, ma dovrebbe essere sufficiente per iniziare. Consiglierei di leggere qualcosa in più su queste pagine. Ciò si rivelerà utile nel perfezionare questa espressione per soddisfare le tue esigenze specifiche.
http://www.javascriptkit.com/jsref/regexp.shtml
http://www.regular-expressions.info
Aggiunta finale:
Dato che questa domanda ha ancora molte visualizzazioni, ho pensato di aggiungere un esempio di .replace
usato con una funzione di callback. In questo caso, semplifica notevolmente l'espressione e offre una flessibilità ancora maggiore, come la sostituzione con la corretta capitalizzazione o la sostituzione di entrambi cat
e cats
in una volta sola:
'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
conca
, quale risultato ti aspetti?caba
?abca
?cca
?