简体   繁体   English

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

[英]How to convert “camelCase” to “Camel Case”?

I've been trying to get a JavaScript regex command to turn something like "thisString" into "This String" but the closest I've gotten is replacing a letter, resulting in something like "Thi String" or "This tring" .我一直在尝试使用 JavaScript 正则表达式命令将诸如"thisString"转换为"This String"但我得到的最接近的是替换一个字母,从而产生诸如"Thi String""This tring" Any ideas?有任何想法吗?

To clarify I can handle the simplicity of capitalizing a letter, I'm just not as strong with RegEx, and splitting "somethingLikeThis" into "something Like This" is where I'm having trouble.为了澄清我可以处理大写字母的简单性,我对 RegEx 没有那么强,并且将"somethingLikeThis"拆分为"something Like This"是我遇到麻烦的地方。

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

displays显示

This String Is Good

 (function() { const textbox = document.querySelector('#textbox') const result = document.querySelector('#result') function split() { result.innerText = textbox.value // insert a space before all caps .replace(/([AZ])/g, ' $1') // uppercase the first character .replace(/^./, (str) => str.toUpperCase()) }; textbox.addEventListener('input', split); split(); }());
 #result { margin-top: 1em; padding: .5em; background: #eee; white-space: pre; }
 <div> Text to split <input id="textbox" value="thisStringIsGood" /> </div> <div id="result"></div>

I had an idle interest in this, particularly in handling sequences of capitals, such as in xmlHTTPRequest.我对此有兴趣,尤其是在处理大写字母序列方面,例如在 xmlHTTPRequest 中。 The listed functions would produce "Xml HTTP Request" or "Xml HTTPRequest", mine produces "Xml HTTP Request".列出的函数会产生“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(); })
}

There's also a String.prototype version in a gist . gist 中还有一个 String.prototype 版本。

This can be concisely done with regex lookahead ( live demo ):这可以通过 regex lookahead ( live demo ) 简洁地完成:

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

(I thought that the g (global) flag was necessary, but oddly enough, it isn't in this particular case.) (我认为g (全局)标志是必要的,但奇怪的是,它不是在这种特殊情况下。)

Using lookahead with split ensures that the matched capital letter is not consumed and avoids dealing with a leading space if UpperCamelCase is something you need to deal with.如果您需要处理 UpperCamelCase,则使用带有split前瞻可确保不消耗匹配的大写字母并避免处理前导空格。 To capitalize the first letter of each, you can use:要将每个字母的首字母大写,您可以使用:

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

The map array method is an ES5 feature, but you can still use it in older browsers with some code from MDC . map数组方法是 ES5 的一项功能,但您仍然可以使用MDC 中的一些代码在旧浏览器中使用它。 Alternatively, you can iterate over the array elements using a for loop.或者,您可以使用for循环遍历数组元素。

I think this should be able to handle consecutive uppercase characters as well as simple camelCase.我认为这应该能够处理连续的大写字符以及简单的驼峰式。

For example: someVariable => someVariable, but ABCCode != ABC Code.例如:someVariable => someVariable,但 ABCCode != ABC Code。

The below regex works on your example but also the common example of representing abbreviations in camcelCase.下面的正则表达式适用于您的示例,也是在 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"

You could also adjust as above to capitalize the first character.您也可以按上述方式调整以大写第一个字符。

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

spacecamel('somethingLikeThis') spacecamel('somethingLikeThis')

// returned value: something Like This // 返回值:像这样的东西

Lodash使用_.startCase()很好地处理了这个问题

A solution that handles numbers as well:一个处理数字的解决方案:

function capSplit(str){
   return str.replace
      ( /(^[a-z]+)|[0-9]+|[A-Z][a-z]+|[A-Z]+(?=[A-Z][a-z]|[0-9])/g
      , function(match, first){
          if (first) match = match[0].toUpperCase() + match.substr(1);
          return match + ' ';
          }
       )
   }

Tested here [JSFiddle, no library.在这里测试 [JSFiddle,没有库。 Not tried IE];没试过IE]; should be pretty stable.应该很稳定。

If you don't care about older browsers (or don't mind using a fallback reduce function for them), this can split even strings like 'xmlHTTPRequest' (but certainly the likes of 'XMLHTTPRequest' cannot).如果您不关心旧浏览器(或者不介意为它们使用回退reduce函数),这甚至可以拆分像 'xmlHTTPRequest' 这样的字符串(但肯定不能像 'XMLHTTPRequest' 这样的字符串)。

function splitCamelCase(str) {
        return str.split(/(?=[A-Z])/)
                  .reduce(function(p, c, i) {
                    if (c.length === 1) {
                        if (i === 0) {
                            p.push(c);
                        } else {
                            var last = p.pop(), ending = last.slice(-1);
                            if (ending === ending.toLowerCase()) {
                                p.push(last);
                                p.push(c);
                            } else {
                                p.push(last + c);
                            }
                        }
                    } else {
                        p.push(c.charAt(0).toUpperCase() + c.slice(1));
                    }
                    return p;
                  }, [])
                  .join(' ');
}

My version我的版本

function camelToSpace (txt) {
  return txt
    .replace(/([^A-Z]*)([A-Z]*)([A-Z])([^A-Z]*)/g, '$1 $2 $3$4')
    .replace(/ +/g, ' ')
}
camelToSpace("camelToSpaceWithTLAStuff") //=> "camel To Space With TLA Stuff"

Try this solution here -在这里尝试这个解决方案 -

var value = "myCamelCaseText";
var newStr = '';
for (var i = 0; i < value.length; i++) {
  if (value.charAt(i) === value.charAt(i).toUpperCase()) {
    newStr = newStr + ' ' + value.charAt(i)
  } else {
    (i == 0) ? (newStr += value.charAt(i).toUpperCase()) : (newStr += value.charAt(i));
  }
}
return newStr;
const value = 'camelCase';
const map = {};
let index = 0;
map[index] = [];
for (let i = 0; i < value.length; i++) {
  if (i !== 0 && value[i] === value[i].toUpperCase()) {
    index = i;
    map[index] = [];
  }
  if (i === 0) {
    map[index].push(value[i].toUpperCase());
  } else {
    map[index].push(value[i]);
  }
}
let resultArray = [];
Object.keys(map).map(function (key, index) {
  resultArray = [...resultArray, ' ', ...map[key]];
  return resultArray;
});
console.log(resultArray.join(''));

Not regex, but useful to know plain and old techniques like this:不是正则表达式,但有助于了解像这样的简单和古老的技术:

var origString = "thisString";
var newString = origString.charAt(0).toUpperCase() + origString.substring(1);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM