Javascript camelCase到正则表单
我一直试图得到一个JavaScript的正则expression式命令,把thisString
This String
东西变成This String
但最近我得到的是replace一个字母,导致像Thi String
或This 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);