为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

茅侃侃 2022-12-29 15:17:58
我正在尝试使可变字符串大写, () 内的字母小写。字符串将是用户输入的内容,所以不知道它会提前。用户输入示例输入了什么(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。我之前用一个 () 问过一个类似的问题,但现在我们期望字符串中有多个 () 。
查看完整描述

3 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

您可以将该.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)LO

console.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)LO

console.log(uppercase("(H)ELLO (W)orld")); // (h)ELLO (w)ORLD


查看完整回答
反对 回复 2022-12-29
?
函数式编程

TA贡献1807条经验 获得超9个赞

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


查看完整回答
反对 回复 2022-12-29
?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

以防万一您想要更快的正则表达式替代方案,您可以使用否定字符 ( ^)) 正则表达式而不是惰性 ( ?)。它更快,因为它不需要回溯

const uppercase = str => 
    str.toUpperCase().replace(/\([^)]+\)/g, m => m.toLowerCase());


查看完整回答
反对 回复 2022-12-29
  • 3 回答
  • 0 关注
  • 92 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信