Cập nhật:
Có một chút muộn cho một bản cập nhật, nhưng vì tôi chỉ vấp phải câu hỏi này và nhận thấy rằng câu trả lời trước đây của tôi không phải là một câu hỏi mà tôi hài lòng. Vì câu hỏi liên quan đến việc thay thế một từ duy nhất, thật khó tin không ai nghĩ đến việc sử dụng ranh giới từ ( \b
)
'a cat is not a caterpillar'.replace(/\bcat\b/gi,'dog');
//"a dog is not a caterpillar"
Đây là một regex đơn giản tránh thay thế các phần của từ trong hầu hết các trường hợp. Tuy nhiên, một dấu gạch ngang -
vẫn được coi là một ranh giới từ. Vì vậy, điều kiện có thể được sử dụng trong trường hợp này để tránh thay thế các chuỗi như 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"
về cơ bản, câu hỏi này giống như câu hỏi ở đây:
Javascript thay thế "'" bằng "' '"
@Mike, kiểm tra câu trả lời tôi đã đưa ra ở đó ... regrec không phải là cách duy nhất để thay thế nhiều lần xuất hiện của một chương trình con, cách xa nó. Suy nghĩ linh hoạt, suy nghĩ chia rẽ!
var newText = "the cat looks like a cat".split('cat').join('dog');
Ngoài ra, để ngăn thay thế các phần từ - câu trả lời được phê duyệt cũng sẽ làm! Bạn có thể giải quyết vấn đề này bằng cách sử dụng các biểu thức thông thường, tôi thừa nhận, có phần phức tạp hơn và như một kết quả cuối cùng, cũng chậm hơn một chút:
var regText = "the cat looks like a cat".replace(/(?:(^|[^a-z]))(([^a-z]*)(?=cat)cat)(?![a-z])/gi,"$1dog");
Tuy nhiên, đầu ra giống như câu trả lời được chấp nhận, sử dụng biểu thức / cat / g trên chuỗi này:
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" ??
Rất tiếc, đây có lẽ không phải là điều bạn muốn. Vậy thì là gì? IMHO, một regex chỉ thay thế 'mèo' một cách có điều kiện. (tức là không phải là một phần của một từ), như vậy:
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"
Tôi đoán là, điều này đáp ứng nhu cầu của bạn. Tất nhiên, nó không đầy đủ, nhưng nó đủ để giúp bạn bắt đầu. Tôi khuyên bạn nên đọc thêm một số trên các trang này. Điều này sẽ hữu ích trong việc hoàn thiện biểu thức này để đáp ứng nhu cầu cụ thể của bạn.
http://www.javascriptkit.com/jsref/regapi.shtml
http://www.uity-expressions.info
Bổ sung cuối cùng:
Cho rằng câu hỏi này vẫn nhận được rất nhiều lượt xem, tôi nghĩ rằng tôi có thể thêm một ví dụ về việc .replace
sử dụng chức năng gọi lại. Trong trường hợp này, nó đơn giản hóa đáng kể biểu thức và cung cấp sự linh hoạt hơn nữa, như thay thế bằng cách viết hoa đúng hoặc thay thế cả hai cat
và cats
trong một lần:
'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
vớica
, mà kết quả làm bạn mong đợi?caba
?abca
?cca
?