我一直试图得到一个JavaScript regex命令,把类似“thisString”的东西变成“This String”,但我得到的最接近的是替换一个字母,导致类似“This String”或“This String”的东西。什么好主意吗?

为了澄清我可以处理大写字母的简单性,我只是不太擅长RegEx,把“somethingLikeThis”分割成“somethingLikeThis”是我遇到麻烦的地方。


当前回答

不是正则表达式,但知道这些简单而古老的技巧是有用的:

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

其他回答

如果你不关心旧的浏览器(或者不介意为它们使用回退减少函数),这甚至可以分割'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(' ');
}

试试这个解决方案

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;

我对此没什么兴趣,特别是在处理大写字母序列方面,比如xmlHTTPRequest。列出的函数会产生“Xml HTTPRequest”或“Xml HTTPRequest”,我的产生“Xml HTTPRequest”。

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(); })
}

还有一个字符串。原型版本的一个要旨。

一个处理数字的解决方案:

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 + ' ';
          }
       )
   }

测试在这里[JSFiddle,没有库。没有尝试IE];应该很稳定。

这可以用regex lookahead(现场演示)简单地完成:

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

(我认为g(全局)标志是必要的,但奇怪的是,在这个特定的情况下并不是这样。)

如果需要处理UpperCamelCase,那么使用ahead和split可以确保匹配的大写字母不会被消耗,并避免处理前导空格。要将每个字母的首字母大写,可以使用:

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

映射数组方法是ES5的一个特性,但是您仍然可以通过MDC的一些代码在旧的浏览器中使用它。或者,您可以使用for循环遍历数组元素。