如何将“camelCase”转换为“CamelCase”?

IT技术 javascript regex
2021-02-18 23:35:34

我一直在尝试使用 JavaScript regex 命令将类似的内容"thisString"转换为,"This String"但我得到的最接近的是替换一个字母,导致类似"Thi String""This tring". 有任何想法吗?

为了澄清我可以处理一个大写字母的简单,我只是不与正则表达式强,拆分"somethingLikeThis""something Like This"是在那里我遇到麻烦了。

6个回答
"thisStringIsGood"
    // insert a space before all caps
    .replace(/([A-Z])/g, ' $1')
    // uppercase the first character
    .replace(/^./, function(str){ return str.toUpperCase(); })

显示

This String Is Good

好人,分手吧。请记住 Bobince 的建议:stackoverflow.com/questions/1732348/...
2021-04-22 23:35:34
你确定这与IE兼容吗?刚刚在 IETester7 中尝试过并出现错误。
2021-05-06 23:35:34
@ColdCerberus 您可以使用:str.replace(/((?<!^)[A-Z](?![A-Z]))(?=\S)/g, ' $1').replace(/^./, s => s.toUpperCase() );它会转换userIDUser ID,甚至会转换userIDFieldUser ID Field
2021-05-10 23:35:34
还补充说:如果你有一个全大写的首字母缩略词,你想保持在一起,你可以将第一个正则表达式更改为“/([AZ][az])/”
2021-05-14 23:35:34
"This" -> "This"(不需要的前缀空格)。也许将其更改为: str.slice(0, 1).toUpperCase() + str.slice(1).replace(/([AZ])/g, ' $1')
2021-05-16 23:35:34

我对此有兴趣,尤其是在处理大写字母序列方面,例如在 xmlHTTPRequest 中。列出的函数会产生“Xml HTTP 请求”或“Xml HTTPRequest”,我的会产生“Xml HTTP 请求”。

function unCamelCase (str){
    return str
        // insert a space between lower & upper
        .replace(/([a-z])([A-Z])/g, '$1 $2')
        // space before last upper in a sequence followed by lower
        .replace(/\b([A-Z]+)([A-Z])([a-z])/, '$1 $2$3')
        // uppercase the first character
        .replace(/^./, function(str){ return str.toUpperCase(); })
}

gist 中还有一个 String.prototype 版本

同样可以通过 2 个替换调用来实现: str.replace(/((?<!^)[A-Z](?![A-Z]))(?=\S)/g, ' $1').replace(/^./, s => s.toUpperCase() )
2021-05-07 23:35:34

这可以通过 regex lookahead ( live demo )简洁地完成

function splitCamelCaseToString(s) {
    return s.split(/(?=[A-Z])/).join(' ');
}

(我认为g(全局)标志是必要的,但奇怪的是,它不是在这种特殊情况下。)

split如果您需要处理 UpperCamelCase,则使用 Lookahead with可确保不消耗匹配的大写字母并避免处理前导空格。要将每个字母的首字母大写,您可以使用:

function splitCamelCaseToString(s) {
    return s.split(/(?=[A-Z])/).map(function(p) {
        return p.charAt(0).toUpperCase() + p.slice(1);
    }).join(' ');
}

map阵列方法是ES5功能,但你仍然可以使用它在旧的浏览器从MDC一些代码或者,您可以使用循环遍历数组元素for

First 函数将其拆分,但不会将第一个单词 PascalCase。第二个函数在非驼峰式大小写的情况下失败。(例如:'id')
2021-04-17 23:35:34

我认为这应该能够处理连续的大写字符以及简单的驼峰式。

例如:someVariable => someVariable,但是 ABCCode != ABC Code。

下面的正则表达式适用于您的示例,也是在 camcelCase 中表示缩写的常见示例。

"somethingLikeThis"
    .replace(/([a-z])([A-Z])/g, '$1 $2')
    .replace(/([A-Z])([a-z])/g, ' $1$2')
    .replace(/\ +/g, ' ') => "something Like This"

"someVariableWithABCCode"
    .replace(/([a-z])([A-Z])/g, '$1 $2')
    .replace(/([A-Z])([a-z])/g, ' $1$2')
    .replace(/\ +/g, ' ') => "some Variable With ABC Code"

您也可以按上述方式调整以大写第一个字符。

function spacecamel(s){
    return s.replace(/([a-z])([A-Z])/g, '$1 $2');
}

spacecamel('somethingLikeThis')

// 返回值:像这样的东西

我总是喜欢这样的单行解决方案
2021-04-25 23:35:34
好东西!这正是我想要拆分的内容,例如:DiscoveryChannel 和 HBO 其他答案给了我探索频道和 HBO,但是您的答案对我有用,因为 HBO 保持完整,谢谢!
2021-05-06 23:35:34