如何在JavaScript中实现字符串首字母大写且括号内字符全大写的格式化?
解决方案:同时实现单词首字母大写与括号内全大写
我明白你的需求——既要让每个单词首字母大写,又要把括号里的内容全转成大写,而lodash的_.startCase确实帮你搞定了前者,但括号内的部分就鞭长莫及了。别担心,结合正则表达式或者原生JS的字符串处理就能解决这个问题,下面给你两种实用的方案:
方案一:基于Lodash + 正则替换(推荐)
这个方案在你现有代码的基础上扩展,先用Lodash处理整体的单词首字母大写,再用正则把括号内的内容转成大写,简单高效,还能处理多个括号的场景:
function formatTargetString(str) { // 先统一转小写,再用startCase实现单词首字母大写 let processedStr = _.startCase(_.toLower(str)); // 全局匹配所有括号内的内容,替换为大写形式 return processedStr.replace(/\((.*?)\)/g, (match, group) => `(${group.toUpperCase()})`); } // 测试用例验证 console.log(formatTargetString("Laugh out Loud (lol)")); // 输出:Laugh Out Loud (LOL) console.log(formatTargetString("Point of view (pov)")); // 输出:Point Of View (POV) console.log(formatTargetString("What the hell")); // 输出:What The Hell console.log(formatTargetString("Hello (foo) world (bar)")); // 输出:Hello (FOO) World (BAR)
原理说明:
_.toLower(str)把整个字符串转成小写,避免原字符串中存在大小写混乱的情况;_.startCase(...)会自动把空格分隔的单词首字母大写,其他字母小写;- 正则
/\((.*?)\)/g是全局匹配所有括号内的内容(.*?是非贪婪匹配,避免多个括号时匹配出错),然后通过回调函数把捕获到的括号内文本转成大写,再重新包裹括号。
方案二:纯原生JavaScript实现(无依赖)
如果你的项目不想依赖Lodash,用原生JS也能实现同样的效果,步骤是先处理括号外的内容,再单独处理括号内的部分:
function formatTargetString(str) { // 第一步:处理括号外的单词首字母大写 // 先移除所有括号内容,得到纯文本部分 let plainText = str.replace(/\(.*?\)/g, '').trim(); // 转小写后按空格拆分,逐个单词首字母大写 let capitalizedPlain = plainText.toLowerCase().split(' ') .map(word => word ? word.charAt(0).toUpperCase() + word.slice(1) : word) .join(' '); // 第二步:处理括号内的内容(如果存在) let parenthesisMatches = str.match(/\(.*?\)/g); if (parenthesisMatches) { // 把每个括号内的内容转大写 let processedParentheses = parenthesisMatches.map(match => `(${match.slice(1, -1).toUpperCase()})` ); // 拼接回处理后的纯文本 return `${capitalizedPlain} ${processedParentheses.join(' ')}`; } // 没有括号的情况直接返回处理后的纯文本 return capitalizedPlain; } // 测试验证 console.log(formatTargetString("Laugh out Loud (lol)")); // 输出:Laugh Out Loud (LOL) console.log(formatTargetString("Point of view (pov)")); // 输出:Point Of View (POV) console.log(formatTargetString("What the hell")); // 输出:What The Hell
原理说明:
- 先通过正则移除所有括号内容,单独处理剩余文本的单词首字母大写;
- 用
match(/\(.*?\)/g)捕获所有括号内容,逐个转成大写; - 最后把处理后的纯文本和括号内容拼接起来,得到最终结果。
注意事项
- 如果你的字符串中存在嵌套括号(比如
Hello (foo(bar))),上面的正则可能无法正确匹配,这种场景需要调整正则逻辑,但根据你的需求示例,应该不需要处理嵌套情况; - 方案一因为用了全局正则,处理多括号的场景更简洁,推荐优先使用。
内容的提问来源于stack exchange,提问作者Anna P
相关产品推荐
相关产品推荐

