要求
将字符串转换为 spinal case。Spinal case 是 all-lowercase-words-joined-by-dashes 这种形式的,也就是以连字符连接所有小写单词。
样本
spinalCase("This Is Spinal Tap")
应该返回 "this-is-spinal-tap"
。
spinalCase("thisIsSpinalTap")
应该返回 "this-is-spinal-tap"
。
spinalCase("The_Andy_Griffith_Show")
应该返回 "the-andy-griffith-show"
。
spinalCase("Teletubbies say Eh-oh")
应该返回 "teletubbies-say-eh-oh"
。
参考
暴力解法
function spinalCase(str) {
//将不是字母或-的字符替换为-
str = str.replace(/[^a-zA-Z\-]/g,'-');
//将大写字母换为小写字母
str = str.replace(/[A-Z]/g,function(match,offset){
//如果大写字母前面还是字母
if(/[a-z]/.test(str[offset-1])){
return '-'+match.toLowerCase();
}else{
return match.toLowerCase();
}
});
//如果第一个不是字母则去掉
if(!/^[a-zA-Z]/.test(str))str=str.substring(1);
return str;
}
spinalCase('Teletubbies say Eh-oh');
这里犯了一个大错误,以把大写化为小写的思路开始,以找到大写字母再转为小写字母为路径,忽略了其实可以最后全部转换为小写。
简洁解法
function spinalCase(str) {
return str.replace(/[^a-zA-Z\-]/g,'-')//将非字母或连字符转为连字符
.replace(/([a-z])([A-Z])/g,'$1-$2')//将大写转为小写或小写大写转为小写-大写
.toLowerCase();//全部转为小写
}
spinalCase('Teletubbies say Eh-oh');