将句子或驼峰式单词转换为连字符形式

4

我尝试将句子大小写和驼峰命名法转换为连字符命名法。

我可以通过在每个大写字母前添加空格来将驼峰命名法转换,但是当我将其应用于含有空格后大写字母的句子时,会出现额外的间距。

以下是我的函数:

function spinalCase(str) {
    var noCamel = str.replace(/([A-Z])/g, ' $1');
    var newStr = noCamel.replace(/\s|_/g, "-");
    return newStr.toLowerCase();
}

spinalCase("makeThisSpinal"); //returns make-this-spinal
spinalCase("Make This Spinal"); //returns -make--this--spinal

你能举出更多的例子来突出这个函数要做什么吗?我在看第二个例子时感到困惑,因为它似乎是你想要的东西,而不是你想要避免的东西。 - yurisich
你可以使用以下代码替换你的变量newStr:var newStr = noCamel.replace(/\s+|_+/g, "-"); 这将消除额外的空格,但你需要考虑“特殊情况”,比如第一个单词的大写字母。 - Ziv Weissman
5个回答

2
获取 lodash,具体来说是 https://lodash.com/docs#kebabCase
_.kebabCase('makeThisSpinal') // make-this-spinal
_.kebabCase('Even Sentences Work') // even-sentences-work

1

改为:

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

尝试:

var noCamel = str.replace(/(\B[A-Z])/g, ' $1');

1
对于提问者的参考:\B“匹配零宽度非单词边界,如两个字母之间或两个空格之间。” 请参见:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp - Josh Beam

0

这是因为您正在用空格替换所有大写字母及其小写字母。因此,在您的句子中,thisspinal之前会出现两个空格。

您可以将所有大写字母替换为"-$1",然后只需从字符串中删除所有空格。


0
function spinalCase(str) {
    var noCamel = str.replace(/([a-z](?=[A-Z]))/g, '$1 ')
    var newStr = noCamel.replace(/\s|_/g, "-");
    return newStr.toLowerCase();
}

spinalCase("makeThisSpinal"); //returns make-this-spinal
spinalCase("Make This Spinal"); //returns -make-this-spinal

在进行驼峰拆分时,你应该使用str.replace(/([a-z](?=[A-Z]))/g, '$1 ')而不是str.replace(/([A-Z])/g, ' $1')。这样可以无论大小写都在每个单词之间添加空格。


0

这是我的解决方案,也许你会发现它是一个很好的参考:

function spinalCase(str) {
  var newStr = str[0];

  for (var j = 1; j < str.length; j++) {
    // if not a letter make a dash
    if (str[j].search(/\W/) !== -1 || str[j] === "_") {
      newStr += "-";
    }
    // if a Capital letter is found 
    else if (str[j] === str[j].toUpperCase()) {
      // and preceded by a letter or '_'
      if (str[j-1].search(/\w/) !== -1 && str[j-1] !== "_") {
        // insert '-' and carry on
        newStr += "-";
        newStr += str[j];
      }
      else {
        newStr += str[j];
      }
    }
    else {
        newStr += str[j];
    }
  }

  newStr = newStr.toLowerCase();
  return newStr;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接