将骆驼命名法转换为小驼峰式命名法的技巧

6

我已经编写了一个将字符串转换为驼峰式的函数(要求是将单词开头和每个连字符后面的字符提升,适用于人名)。

function sadCamelize(input) {
  return input.toLowerCase().replace(/([-\s])(.)/g,
    function(match, separator, starter) {
      return separator + starter.toUpperCase();
  });
}

现在,我想让我的驼骆驼开心,即使是字符串的第一个字符(不是连续的空格或连字符),也会被抬起。也就是说,不是这样子的:
HONKA-HONKA -> honka-Honka
我想要得到的是:
HONKA-HONKA -> Honka-Honka
目前我卡住了,可能是因为很烦。所有的骆驼都很沮丧,我也是。另外,我称之为悲伤/快乐骆驼的正确术语是什么(头部向下/向上)?
3个回答

7
function happyCamelize(str) {
    return str.replace(/([a-z])([a-z]+)/gi, function(_, $1, $2) {
        // _: The entire matched string. not used here.
        // $1: The first group. The first alphabet.
        // $2: The second group. The rest alphabets.
        return $1.toUpperCase() + $2.toLowerCase();
    });
}

例子:

happyCamelize('HONKA-HONKA') // "Honka-Honka"

注意 这段代码不会改变单个长度的单词。

happyCamelize('h') // => "h"
happyCamelize('H') // => "H"

如果您想将单个字母的单词转换为驼峰式,请使用/([a-z])([a-z]*)/gi

我不确定为什么它能工作,但是它不应该在大写字符上失败吗?正则表达式如何知道匹配"A-Z"呢? - Konrad Viltersten
@KonradViltersten,使用i标志表示忽略大小写;A-Z匹配大写和小写字母。 - falsetru
@falsetru 没有注意到 "i"。现在我看到了。我开始怀疑黑魔法(无论如何,在大多数情况下,正则表达式都感觉像是黑魔法,嘿嘿)。 - Konrad Viltersten

4
这个丑陋的一行代码可以完成任务。
"HONKA-HONKA".toLowerCase().split(/\b/g).map(function(word) { return word[0].toUpperCase() + word.slice(1)}).join('')

让我解释一下:
"HONKA-HONKA".toLowerCase().split(/\b/g).map(function(word) {
  return word[0].toUpperCase() + word.slice(1);
}).join('');

现在将其封装成一个函数。
function sadCamelize(str) {
    return str.toLowerCase().split(/\b/g).map(function(word) {
      return word[0].toUpperCase() + word.slice(1);
    }).join('');
}

以下是操作序列:

  • 将所有内容转换为小写
  • 按单词(\b)分割
  • 映射正则表达式结果的每个部分,使第一个字母变成大写
  • word.slice(1) 从数组中移除第一个元素

@mplungjan 感谢提供 MDN 参考,但是留下评论或编辑会更有用。 - lukas.pukenis

2
您好,以下是您需要翻译的内容:

您的问题的第一部分已经由lukas回答了,所以我来回答第二部分。

honkaHonka = 驼峰式命名法

HonkaHonka = 帕斯卡式命名法

还有其他变体和同义词。请参见此处:http://en.wikipedia.org/wiki/CamelCase#Variations_and_synonyms


下划线命名法或驼峰命名法或大驼峰命名法 - mplungjan
@mplungjan BumpyCaps或CamelCaps或HumpBack或InterCaps或WikiCase:http://en.wikipedia.org/wiki/CamelCase#Variations_and_synonyms - Abhitalks

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