You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何分割无空格及非字母字符的字符串?驼峰转spinal case求助

如何将驼峰式字符串转换为脊柱式(kebab-case)字符串?

需求:将字符串"thisIsSpinalTap"转换为this-is-spinal-tap。

我尝试编写JavaScript代码实现该功能,思路是在大写字符前添加空格,但运行结果混乱,不知如何正确实现。以下是我尝试的代码:

function isUpper(str)
{
  return str === str.toUpperCase();
}

function spinalCase(str) {
 
  let s=str.split('');
  let string=str.split('');

  for(var i=0;i<str.split('').length;i++)
  {
    if(isUpper(string[i]))
    {
        string.splice(i-1, 0, " ");
    }
      console.log(string)
  }
  return str;
}

spinalCase('thisIsSpinalTap');

你的代码存在几个核心问题:

  • 循环索引混乱:用原字符串长度作为循环上限,但splice会修改数组长度,插入空格后后续字符索引偏移,导致部分字符无法被正确遍历。
  • 返回错误结果:最后返回的是原始字符串str,而非处理后的数组内容。
  • 逻辑细节错误:i=0时i-1=-1会把空格插入数组开头,不符合需求;且需求是用连字符-而非空格,最终还需转全小写。

推荐两种简单的实现方法:

方法一:正则表达式(最简洁)

匹配小写字母后跟大写字母的位置,插入连字符后统一转小写:

function spinalCase(str) {
  // 匹配小写+大写的组合,替换为「小写-大写」,再转全小写
  return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
}

// 测试
console.log(spinalCase('thisIsSpinalTap')); // 输出 "this-is-spinal-tap"

方法二:数组遍历(更直观)

遍历字符数组,遇到大写字母时在其前插入连字符,同时调整索引避免重复处理:

function isUpper(char) {
  return char === char.toUpperCase();
}

function spinalCase(str) {
  const chars = str.split('');
  // 从第2个字符开始遍历(第一个字符前无需加连字符)
  for (let i = 1; i < chars.length; i++) {
    if (isUpper(chars[i])) {
      chars.splice(i, 0, '-');
      i++; // 插入连字符后,跳过该字符避免重复处理
    }
  }
  return chars.join('').toLowerCase();
}

// 测试
console.log(spinalCase('thisIsSpinalTap')); // 输出 "this-is-spinal-tap"

内容的提问来源于stack exchange,提问作者Boxstation YT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 14:27:31