猿问

将 () 中的任何字母设为小写,将所有其他字母设为大写

我正在尝试使可变字符串大写, () 内的字母小写。字符串将是用户输入的内容,所以不知道它会提前。


用户输入示例


输入了什么


(H)e(L)lo 预期结果是什么


(h)E(l)LO 输入了什么


(H)ELLO (W)orld 预期结果是什么


(h)ELLO (w)ORLD 这是我尝试过的方法,但只有在 () 位于字符串末尾时才能让它工作。


if(getElementById("ID")){

    var headline = getElementById("ID").getValue();

    var headlineUpper = headline.toUpperCase();

    var IndexOf = headlineUpper.indexOf("(");

    if(IndexOf === -1){

        template.getRegionNode("Region").setValue(headlineUpper);

    }

    else{

        var plus = parseInt(IndexOf + 1);

        var replacing = headlineUpper[plus];

        var lower = replacing.toLowerCase();

        var render = headlineUpper.replace(headlineUpper.substring(plus), lower + ")");

        

        getElementById("Region").setValue(render);

    }

}

对我们的系统做我只能使用香草javascript。我之前用一个 () 问过一个类似的问题,但现在我们期望字符串中有多个 () 。


茅侃侃
浏览 94回答 3
3回答

千巷猫影

您可以将该.replace()方法与正则表达式一起使用。首先,您可以使用.toUpperCase(). 然后,你可以匹配中间的所有字符,(并)使用该replace方法的替换功能将匹配到的字符转换为小写。请参见下面的示例:function uppercase(str) {  return str.toUpperCase().replace(/\(.*?\)/g, function(m) {    return m.toLowerCase();  });}console.log(uppercase("(H)e(L)lo")); // (h)E(l)LOconsole.log(uppercase("(H)ELLO (W)orld")); // (h)ELLO (w)ORLD如果你可以支持 ES6,你可以用箭头函数清理上面的函数:const uppercase = str =>     str.toUpperCase().replace(/\(.*?\)/g, m => m.toLowerCase());console.log(uppercase("(H)e(L)lo")); // (h)E(l)LOconsole.log(uppercase("(H)ELLO (W)orld")); // (h)ELLO (w)ORLD

函数式编程

我试图在不使用任何正则表达式的情况下做到这一点。我正在存储 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));

一只萌萌小番薯

以防万一您想要更快的正则表达式替代方案,您可以使用否定字符 ( ^)) 正则表达式而不是惰性 ( ?)。它更快,因为它不需要回溯。const uppercase = str =>      str.toUpperCase().replace(/\([^)]+\)/g, m => m.toLowerCase());
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答