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"
 

提示

RegExp

String.replace()

思路

整体思路就是用正则表达式替换字符串指定字符。难点在于正则的写法。现逐步分析。

观察第三个测试语句,发现有的单词之间用下划线 "_" 连接,其它用空格连接,需要把它们转换成同一种占位类型,方便最后统一转换成连接符 "-" 。这里先把下划线转为空格。

str = str.replace(/_/g," ")

测试 spinalCase("The_Andy_Griffith_Show") ,结果为:

The Andy Griffith Show

观察第二个测试语句,单词之间并无空格或其他连接符,而是以首字母大写作为单个单词的判断标准。在大写字母之前添加空格,与上面代码保持一致。本解法中,所有单词分隔在转为 "-" 之前都用空格表示。

str = str.replace(/([A-Z])/g," $1");

其中,小括号表示分组, $1 表示第1个小括号捕获内容。

测试 spinalCase("thisIsSpinalTap") ,结果为:

this Is Spinal Tap

然而,这样做之后,有的语句因为首单词的首字符也是大写的,所以前面也会多个空格。我们需要排除这种情况:

str = str.replace(/^\s/,"");

其中 "^" 表示语句开头, "\s" 表示空白符。

接下来,可以把所有空白符替换为题目要求的连接符 "-" :

str = str.replace(/\s+/g,"-");

其中, "+" 表示匹配前一项一或多次,如果不加这个,有一个以上空格的地方会同时出现多个 "-" 并用情况。

最后,把所有字符转为小写,完成!

 

function spinalCase(str) {
  // "It's such a fine line between stupid, and clever."
  // --David St. Hubbins
  str = str.replace(/_/g," ")
        .replace(/([A-Z])/g," $1")
        .replace(/^\s/,"")
        .replace(/\s+/g,"-")
        .toLowerCase();
  return str;
}

 

posted @ 2016-11-29 16:10  兴趣使然的椰子  阅读(1452)  评论(0编辑  收藏  举报