Оновлення:
Дещо пізно для оновлення, але оскільки я просто спіткнувся з цим питанням і зауважив, що моя попередня відповідь - не одна, якою я задоволений. Оскільки питання стосувалося заміни одного слова, неймовірно, що ніхто не думав використовувати межі слова ( \b
)
'a cat is not a caterpillar'.replace(/\bcat\b/gi,'dog');
//"a dog is not a caterpillar"
Це простий регулярний вираз, який дозволяє уникнути заміни частин слів у більшості випадків. Однак тире -
все ще вважається межею слова. Тому умовні умови можна використовувати в цьому випадку, щоб уникнути заміни рядків типу 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"
в основному це питання те саме, що тут питання:
Javascript замінити "" "на" ""
@Mike, перевіри відповідь, яку я там дав ... regexp - не єдиний спосіб замінити кілька випадків підписки, далеко від неї. Думайте гнучко, думайте про розкол!
var newText = "the cat looks like a cat".split('cat').join('dog');
Крім того, щоб запобігти заміні частин слова, - що також зробить схвалена відповідь! Ви можете подолати цю проблему, використовуючи регулярні вирази, які, я можу визнати, дещо складніші і, як результат цього, ще й повільніші:
var regText = "the cat looks like a cat".replace(/(?:(^|[^a-z]))(([^a-z]*)(?=cat)cat)(?![a-z])/gi,"$1dog");
Вихід такий самий, як прийнятий відповідь, однак, використовуючи вираз / cat / g у цьому рядку:
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" ??
На жаль, це, мабуть, не те, що ви хочете. Що ж тоді? IMHO, регулярний вираз, який лише умовно замінює 'cat'. (тобто не частина слова), наприклад:
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"
Думаю, це відповідає вашим потребам. Звичайно, це не є повною захищеністю, але для початку роботи має бути достатньо. Я б рекомендував прочитати ще трохи на цих сторінках. Це виявиться корисним для вдосконалення цього виразу для задоволення ваших конкретних потреб.
http://www.javascriptkit.com/jsref/regexp.shtml
http://www.regular-expressions.info
Остаточне доповнення:
Зважаючи на те, що це питання все ще отримує багато переглядів, я подумав, що можу додати приклад .replace
використовуваного з функцією зворотного виклику. У цьому випадку це значно спрощує вираз та надає ще більшу гнучкість, як, наприклад, заміна правильної великої літери або заміна обох cat
і cats
за один раз:
'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
вababa
наca
, який результат ви очікуєте?caba
?abca
?cca
?