我要做的是编写一个函数来替换给定句子中的单个单词。其中一个要求是,替换单词的大小写将与原始单词一起保留。
我写了以下函数:
function replace(str, before, after) {
var re = new RegExp('(\\.*)?(' + before + ')(\\.*)?', 'i');
return str.replace(re, after);
}
// DEBUG
console.log('----- DEBUG START -----');
var tasks = [
replace("A quick brown fox jumped over the lazy dog", "jumped", "leaped"),
replace("Let us go to the store", "store", "mall"),
replace("He is Sleeping on the couch", "Sleeping", "sitting"),
replace("This has a spellngi error", "spellngi", "spelling"),
replace("His name is Tom", "Tom", "john"),
replace("Let us get back to more Coding", "Coding", "bonfires"),
];
for (var i = 0; i < tasks.length; i++) {
console.log('Result #' + i + ': ' + tasks[i]);
}
console.log('----- DEBUG END -----');
除after
字的情况与before
字的情况不同外,一切正常。
信息:
我使用数组解决了同样的问题(使用split()
,splice()
,indexOf()
)并仅使用非动态before
替换RegExp()
元素案件得以保留。这就是为什么我不太明白为什么我的其他解决方案不起作用的原因。
答案 0 :(得分:3)
您正在用另一个字符串替换字符串。 JS不会神奇地将原始单词的大小写应用于替换单词,因为这可能导致潜在的不良行为。如果你必须保留角色的情况,你需要尽力去做。
如果您只关心第一个字母的大小写,您可以在replace
函数中执行以下操作:
function replace(str, before, after) {
var b0 = before[0];
after = after.replace(/^(.)/, function(a0){
return b0.toUpperCase() === b0 ? a0.toUpperCase() : a0.toLowerCase();
});
var re = new RegExp('(\\.*)?(' + before + ')(\\.*)?', 'i');
return str.replace(re, after);
}
// DEBUG
document.write('----- DEBUG START -----<br>');
var tasks = [
replace("A quick brown fox jumped over the lazy dog", "jumped", "leaped"),
replace("Let us go to the store", "store", "mall"),
replace("He is Sleeping on the couch", "Sleeping", "sitting"),
replace("This has a spellngi error", "spellngi", "spelling"),
replace("His name is Tom", "Tom", "john"),
replace("Let us get back to more Coding", "Coding", "bonfires"),
];
for (var i = 0; i < tasks.length; i++) {
document.write('Result #' + i + ': ' + tasks[i]+'<br>');
}
document.write('----- DEBUG END -----');