Aktualisierung:
Es ist etwas spät für ein Update, aber da ich gerade über diese Frage gestolpert bin und festgestellt habe, dass ich mit meiner vorherigen Antwort nicht zufrieden bin. Da es bei der Frage um die Ersetzung eines einzigen Wortes ging, ist es unglaublich, dass niemand an die Verwendung von Wortgrenzen ( \b
)
'a cat is not a caterpillar'.replace(/\bcat\b/gi,'dog');
//"a dog is not a caterpillar"
Dies ist eine einfache Regex, die in den meisten Fällen das Ersetzen von Wortteilen vermeidet. Allerdings kann ein Bindestrich -
gilt immer noch als Wortgrenze. Daher können in diesem Fall Konditionale verwendet werden, um das Ersetzen von Zeichenketten wie 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"
Im Grunde genommen ist diese Frage die gleiche wie die hier gestellte Frage: Javascript ersetzt " ' " durch " '' "
@Mike, überprüfen Sie die Antwort, die ich dort gegeben habe... regexp ist nicht der einzige Weg, um mehrere Vorkommen eines Unterbegriffs zu ersetzen, weit davon entfernt. Denken Sie flexibel, denken Sie geteilt!
var newText = "the cat looks like a cat".split('cat').join('dog');
Oder um das Ersetzen von Wortteilen zu verhindern - was die genehmigte Antwort auch tut! Sie können dieses Problem mit regulären Ausdrücken umgehen, die zugegebenermaßen etwas komplexer und dadurch auch etwas langsamer sind:
var regText = "the cat looks like a cat".replace(/(?:(^|[^a-z]))(([^a-z]*)(?=cat)cat)(?![a-z])/gi,"$1dog");
Die Ausgabe ist dieselbe wie bei der akzeptierten Antwort, allerdings unter Verwendung der /cat/g
Ausdruck auf diese Zeichenfolge:
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, das ist wahrscheinlich nicht das, was Sie wollen. Was ist es dann? IMHO, eine Regex, die 'cat' nur bedingt ersetzt. (also nicht Teil eines Wortes), etwa so:
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"
Ich vermute, dass dies Ihren Bedürfnissen entspricht. Es ist natürlich nicht absolut sicher, aber es sollte für den Anfang ausreichen. Ich würde empfehlen, noch mehr auf diesen Seiten zu lesen. Das wird sich als nützlich erweisen, um diesen Ausdruck für Ihre speziellen Bedürfnisse zu perfektionieren.
http://www.javascriptkit.com/jsref/regexp.shtml
http://www.regular-expressions.info
Letzter Zusatz:
Da diese Frage immer noch häufig gestellt wird, möchte ich ein Beispiel hinzufügen .replace
mit einer Rückruffunktion verwendet. In diesem Fall wird der Ausdruck drastisch vereinfacht und bietet noch mehr Flexibilität, wie das Ersetzen durch korrekte Großschreibung oder das Ersetzen beider cat
y cats
auf einen Schlag:
'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