Aktualisieren:
Es ist etwas spät für ein Update, aber da ich gerade über diese Frage gestolpert bin und festgestellt habe, dass meine vorherige Antwort nicht die ist, mit der ich zufrieden bin. Da die Frage das Ersetzen eines einzelnen Wortes betraf, ist es unglaublich, dass niemand daran gedacht hat, Wortgrenzen zu verwenden ( \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. Ein Bindestrich -
wird jedoch immer noch als Wortgrenze betrachtet. In diesem Fall können also Bedingungen verwendet werden, um das Ersetzen von Zeichenfolgen wie den cool-cat
folgenden zu vermeiden :
'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 ist diese Frage dieselbe wie die Frage hier:
Javascript ersetzt "'" durch "' '"
@ Mike, überprüfen Sie die Antwort, die ich dort gegeben habe ... Regexp ist nicht die einzige Möglichkeit, mehrere Vorkommen eines Abonnements zu ersetzen, weit davon entfernt. Denken Sie flexibel, denken Sie gespalten!
var newText = "the cat looks like a cat".split('cat').join('dog');
Alternativ, um zu verhindern, dass Wortteile ersetzt werden - was auch für die genehmigte Antwort der Fall ist! Sie können dieses Problem mit regulären Ausdrücken umgehen, die zugegebenermaßen etwas komplexer und als Ergebnis 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 entspricht der akzeptierten Antwort, verwendet jedoch den Ausdruck / cat / g für 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" ??
Hoppla, das ist wahrscheinlich nicht das, was du willst. Was ist dann? IMHO, eine Regex, die "Katze" nur bedingt ersetzt. (dh nicht Teil eines Wortes), wie 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, das entspricht Ihren Bedürfnissen. Es ist natürlich nicht vollständig sicher, aber es sollte ausreichen, um Ihnen den Einstieg zu erleichtern. Ich würde empfehlen, auf diesen Seiten mehr zu lesen. Dies wird sich als nützlich erweisen, um diesen Ausdruck so zu perfektionieren, dass er Ihren spezifischen Anforderungen entspricht.
http://www.javascriptkit.com/jsref/regexp.shtml
http://www.regular-expressions.info
Letzte Ergänzung:
Angesichts der Tatsache, dass diese Frage immer noch viele Ansichten enthält, dachte ich, ich könnte ein Beispiel für die .replace
Verwendung mit einer Rückruffunktion hinzufügen . In diesem Fall vereinfacht dramatisch die Expression und bietet noch mehr Flexibilität, wie mit dem richtigen Kapitalisierung zu ersetzen oder beide ersetzen cat
und cats
in einem Rutsch:
'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
durch ersetzenca
?caba
?abca
?cca
?