3 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊
您可以將該.replace()
方法與正則表達(dá)式一起使用。首先,您可以使用.toUpperCase()
. 然后,你可以匹配中間的所有字符,(
并)
使用該replace
方法的替換功能將匹配到的字符轉(zhuǎn)換為小寫(xiě)。
請(qǐng)參見(jiàn)下面的示例:
function uppercase(str) {
return str.toUpperCase().replace(/\(.*?\)/g, function(m) {
return m.toLowerCase();
});
}
console.log(uppercase("(H)e(L)lo")); // (h)E(l)LO
console.log(uppercase("(H)ELLO (W)orld")); // (h)ELLO (w)ORLD
如果你可以支持 ES6,你可以用箭頭函數(shù)清理上面的函數(shù):
const uppercase = str =>
str.toUpperCase().replace(/\(.*?\)/g, m => m.toLowerCase());
console.log(uppercase("(H)e(L)lo")); // (h)E(l)LO
console.log(uppercase("(H)ELLO (W)orld")); // (h)ELLO (w)ORLD

TA貢獻(xiàn)1807條經(jīng)驗(yàn) 獲得超9個(gè)贊
我試圖在不使用任何正則表達(dá)式的情況下做到這一點(diǎn)。我正在存儲(chǔ) all(和的索引)。
String.prototype.replaceBetween = function (start, end, what) {
return this.substring(0, start) + what + this.substring(end);
};
function changeCase(str) {
str = str.toLowerCase();
let startIndex = str.split('').map((el, index) => (el === '(') ? index : null).filter(el => el !== null);
let endIndex = str.split('').map((el, index) => (el === ')') ? index : null).filter(el => el !== null);
Array.from(Array(startIndex.length + 1).keys()).forEach(index => {
if (index !== startIndex.length) {
let indsideParentheses = '(' + str.substring(startIndex[index] + 1, endIndex[index]).toUpperCase() + ')';
str = str.replaceBetween(startIndex[index], endIndex[index] + 1, indsideParentheses);
}
});
return str;
}
let str = '(h)ELLO (w)ORLD'
console.log(changeCase(str));

TA貢獻(xiàn)1795條經(jīng)驗(yàn) 獲得超7個(gè)贊
以防萬(wàn)一您想要更快的正則表達(dá)式替代方案,您可以使用否定字符 ( ^)
) 正則表達(dá)式而不是惰性 ( ?
)。它更快,因?yàn)樗?a >不需要回溯。
const uppercase = str => str.toUpperCase().replace(/\([^)]+\)/g, m => m.toLowerCase());
添加回答
舉報(bào)