Aktualizacja:
Jest nieco późno na aktualizację, ale ponieważ natknąłem się na to pytanie i zauważyłem, że moja poprzednia odpowiedź nie jest tym, z którego jestem zadowolony. Ponieważ pytanie dotyczyło zamiany jednego słowa, to niewiarygodne, że nikt nie pomyślał o użyciu granic słów ( \b
)
'a cat is not a caterpillar'.replace(/\bcat\b/gi,'dog');
//"a dog is not a caterpillar"
Jest to proste wyrażenie regularne, które w większości przypadków pozwala uniknąć zamiany części słów. Jednak myślnik -
jest nadal uważany za granicę słów. Dlatego w tym przypadku można zastosować warunki warunkowe, aby uniknąć zamiany ciągów takich jak 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"
w zasadzie to pytanie jest takie samo jak tutaj:
JavaScript zamień „” na „” „”
@ Mike, sprawdź odpowiedź, której tam udzieliłem ... wyrażenie regularne nie jest jedynym sposobem na zastąpienie wielu wystąpień subskrypcji. Myśl elastycznie, myśl podziel!
var newText = "the cat looks like a cat".split('cat').join('dog');
Ewentualnie, aby zapobiec zamianie części słów - co zrobi również zatwierdzona odpowiedź! Można obejść ten problem za pomocą wyrażeń regularnych, które, przyznaję, są nieco bardziej złożone i jako rezultat tego są też nieco wolniejsze:
var regText = "the cat looks like a cat".replace(/(?:(^|[^a-z]))(([^a-z]*)(?=cat)cat)(?![a-z])/gi,"$1dog");
Dane wyjściowe są takie same, jak zaakceptowana odpowiedź, przy użyciu wyrażenia / cat / g na tym ciągu:
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, to chyba nie jest to, czego chcesz. Czym więc jest? IMHO, regex, który warunkowo zastępuje „cat”. (tj. nie jest częścią słowa), tak jak:
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"
Domyślam się, że to odpowiada twoim potrzebom. Oczywiście nie jest to w pełni odporne, ale powinno wystarczyć, aby zacząć. Polecam przeczytać więcej na tych stronach. Przyda się to w udoskonaleniu tego wyrażenia, aby spełnić Twoje specyficzne potrzeby.
http://www.javascriptkit.com/jsref/regexp.shtml
http://www.regular-expressions.info
Ostateczne dodanie:
Biorąc pod uwagę, że to pytanie wciąż ma wiele wyświetleń, pomyślałem, że mogę dodać przykład .replace
użycia z funkcją wywołania zwrotnego. W tym przypadku radykalnie upraszcza to wyrażenie i zapewnia jeszcze większą elastyczność, na przykład zastępując poprawną pisownię wielkimi literami lub zastępując jedno cat
i drugie cats
za jednym razem:
'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
wababa
zca
, skutkujących można się spodziewać?caba
?abca
?cca
?