首页 > 代码库 > Spinal Tap Case

Spinal Tap Case

题目

将字符串转换为 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"。


思路

看测试用例,需要转换的字符串格式可以归为两类。第一类是利用空格、下划线等符号分解命名、还有第二类是在座诸位比较熟悉的驼峰命名法。以下称符号类型或驼峰类型。

符号类型转换形式是简单的,驼峰类型转换形式也是简单的,但这二者并不相同,怎么区分这二者就是一个难点了。我们可以先定一个可以达到的小目标,比如先把这两种字符串类型分开。博主的方法是将字符串的按照符号类型分解,如果分解后的数组长度为1也就说明了当前字符串不管正不正经,他都是一个驼峰类型的字符串。

 str.split(/\W|_/).length==1 

既然区分开两种字符串类型了,那就把两种字符串类型都转换成题目要求的那样:我-是-吴-彦-祖 这种类型。

驼峰类型转换很简单,只需要历遍字符串,使用正则表达式判断字符串中的某个字符是否为大写,如果是大写转换成小写再在前面加一根短短的东西。方法如下:

 

1     for(var i=0;i<str.length;i++){2       if(/[A-Z]/.test(str[i])){3         str=str.replace(str[i],"-"+str[i].toLowerCase());4       }5     }

 

符号类型就更简单了,只需要将字符串转换成小写并使用正则表达式分离再在每两个之间使用一根东西连接起来即可。

 str=str.toLowerCase().split(/\W|_/).join("-"); 

总体代码如下:

 1 function spinalCase(str) { 2   if(str.split(/\W|_/).length==1){ 3     for(var i=0;i<str.length;i++){ 4       if(/[A-Z]/.test(str[i])){ 5         str=str.replace(str[i],"-"+str[i].toLowerCase()); 6       } 7     } 8   }else str=str.toLowerCase().split(/\W|_/).join("-"); 9   return str;10 }

 

Spinal Tap Case