Javascript camelCase到正则表单

我一直试图得到一个JavaScript的正则expression式命令,把thisString This String东西变成This String但最近我得到的是replace一个字母,导致像Thi StringThis tring 。 有任何想法吗?

为了澄清我可以处理简单的大写字母,我只是没有像RegEx那样强大,并把somethingLikeThis LikeThis分成something Like This是我有麻烦的地方。

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

显示器

 This String Is Good 
 (function() { var $textbox = $('#textbox'), $result = $('#result'), splitter = function() { $result.html($textbox.val() // insert a space before all caps .replace(/([AZ])/g, ' $1') // uppercase the first character .replace(/^./, function(str) { return str.toUpperCase(); })); }; $textbox.on('input', splitter); splitter(); }()); 
 #result { margin-top: 10px; padding-top: 10px; border-top: solid 1px #c3c3c3; } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div> Text to split <input id="textbox" value="thisStringIsGood" /> </div> <div id="result"></div> 

我有一个闲置的兴趣,特别是在处理大写序列,如xmlHTTPRequest。 列出的函数会产生“Xml HTTP Request”或“Xml HTTPRequest”,我的产生“Xml HTTP Request”。

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

要点还有一个String.prototype版本。

这可以用正则expression式( 现场演示 )简洁地完成:

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

(我认为g (全球)旗帜是必要的,但奇怪的是,这不是在这种特殊情况下。)

使用前瞻与split确保匹配的大写字母不被消耗,并避免处理领先的空间,如果UpperCamelCase是你需要处理的东西。 要将每个字母的首字母大写,可以使用:

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

map数组方法是一个ES5function,但您仍然可以在旧版浏览器中使用它,并使用MDC的一些代码 。 或者,您可以使用for循环遍历数组元素。

 function spacecamel(s){ return s.replace(/([az])([AZ])/g, '$1 $2'); } 

spacecamel( 'somethingLikeThis')

//返回值:像这样

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

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

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

 "somethingLikeThis" .replace(/([az])([AZ])/g, '$1 $2') .replace(/([AZ])([az])/g, ' $1$2') .replace(/\ +/g, ' ') => "something Like This" "someVariableWithABCCode" .replace(/([az])([AZ])/g, '$1 $2') .replace(/([AZ])([az])/g, ' $1$2') .replace(/\ +/g, ' ') => "some Variable With ABC Code" 

你也可以像上面那样调整大写第一个字符。

处理数字的解决scheme:

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

在这里testing[JSFiddle,没有图书馆。 没有试过IE]; 应该是相当稳定的。

如果你不关心旧浏览器(或者不介意使用fallback reduce函数),甚至可以拆分'xmlHTTPRequest'之类的string(但是'XMLHTTPRequest'确实不能)。

 function splitCamelCase(str) { return str.split(/(?=[AZ])/) .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(' '); } 

不是正则expression式,但有用的知道这种简单的旧技术。

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