48

例如,假设我总是有一个由“-”分隔的字符串。有没有办法改造

今天是美好的一天

今天是伟大的一天

使用正则表达式?

4

13 回答 13

89

(已编辑以支持非小写输入和 Unicode)

function camelCase(input) { 
    return input.toLowerCase().replace(/-(.)/g, function(match, group1) {
        return group1.toUpperCase();
    });
}

在 MDN 的“将函数指定为参数”文档中查看有关“替换回调”的更多信息。

回调函数的第一个参数是完全匹配,随后的参数是正则表达式中带括号的组(在这种情况下,连字符后面的字符)。

于 2012-05-03T04:56:00.950 回答
6

另一种使用reduce的方法:

function camelCase(str) {
  return str
    .split('-')
    .reduce((a, b) => a + b.charAt(0).toUpperCase() + b.slice(1));
}
于 2017-09-08T12:49:34.430 回答
5

您可以匹配每个破折号 ( -) 或字符串开头之后的单词字符,或者您可以通过匹配每个单词边界 ( \b) 之后的单词字符来简化:

function camelCase(s) {
  return (s||'').toLowerCase().replace(/(\b|-)\w/g, function(m) {
    return m.toUpperCase().replace(/-/,'');
  });
}
camelCase('foo-bar'); // => 'FooBar'
camelCase('FOo-BaR-gAH'); // => 'FooBarGah'
于 2012-05-03T05:06:59.580 回答
3

这是一个演示

var test = 'It-is-a-great-day-today';

function camelize(str) {
    return str[0].toLowerCase() + str.replace(/-([a-z])/g, function(a, b) {
        return b.toUpperCase();
    }).slice(1);
}

console.log(camelize(test));
于 2012-05-03T04:56:51.480 回答
3

这也应该有效:

function camelCase(str) {
  return str.replace(/^.|-./g, function(letter, index) {
    return index == 0 ? letter.toLowerCase() : letter.substr(1).toUpperCase();
  });
}

恕我直言,它的效率更高一些,因为我们不会先将整个输入字符串转换为小写,然后在需要时再转换为大写。此函数仅将第一个字母转换为小写,然后将连字符后的每个字符转换-为大写。

于 2012-05-03T07:06:52.380 回答
2

http://jsfiddle.net/54ZcM/

function camelCase(string) {
    return string.toLowerCase().replace(/(\-[a-zA-Z])/g, function($1) {
        return $1.toUpperCase().replace('-','');
    })
}

alert(camelCase('fOo-BarBA-fo'));
于 2012-05-03T05:15:12.983 回答
2

我知道这个问题有点老了,但是,

这是我的 camelCase 函数版本:

var camelCase = (function () {
    var DEFAULT_REGEX = /[-_]+(.)?/g;

    function toUpper(match, group1) {
        return group1 ? group1.toUpperCase() : '';
    }
    return function (str, delimiters) {
        return str.replace(delimiters ? new RegExp('[' + delimiters + ']+(.)?', 'g') : DEFAULT_REGEX, toUpper);
    };
})();

它处理以下所有边缘情况:

  • 默认情况下同时处理下划线和连字符(可使用第二个参数配置)
  • 带有 unicode 字符的字符串
  • 以连字符或下划线结尾的字符串
  • 具有连续连字符或下划线的字符串

这是现场测试的链接:http: //jsfiddle.net/avKzf/2/

以下是测试结果:

  • 输入:“ab-cd-ef”,结果:“abCdEf”
  • 输入:“ab-cd-ef-”,结果:“abCdEf”
  • 输入:“ab-cd-ef--”,结果:“abCdEf”
  • 输入:“ab-cd--ef--”,结果:“abCdEf”
  • 输入:“--ab-cd--ef--”,结果:“AbCdEf”
  • 输入:“--ab-cd-__-ef--”,结果:“AbCdEf”

请注意,以分隔符开头的字符串将导致开头为大写字母。如果这不是您所期望的,您始终可以使用 lcfirst。如果您需要,这是我的 lcfirst:

function lcfirst(str) {
    return str && str.charAt(0).toLowerCase() + str.substring(1);
}
于 2013-09-01T09:27:37.700 回答
2

这很好用,但有人可能会清理它。

var toCamelCase = function(str) {
        // Replace special characters with a space
        str = str.replace(/[^a-zA-Z0-9 ]/g, " ");
        // put a space before an uppercase letter
        str = str.replace(/([a-z](?=[A-Z]))/g, '$1 ');
        // Lower case first character and some other stuff that I don't understand
        str = str.replace(/([^a-zA-Z0-9 ])|^[0-9]+/g, '').trim().toLowerCase();
        // uppercase characters preceded by a space or number
        str = str.replace(/([ 0-9]+)([a-zA-Z])/g, function(a,b,c) {
            return b.trim() + c.toUpperCase();
        });
        return str;
};

console.log(toCamelCase('hyphen~name~ format'));
console.log(toCamelCase('hyphen.name.format'));
console.log(toCamelCase('hyphen-name-format'));
console.log(toCamelCase('Hyphen-Dame-Gormat'));
console.log(toCamelCase('EquipmentClass name'));
console.log(toCamelCase('Equipment className'));
console.log(toCamelCase('equipment class name'));
console.log(toCamelCase(' e    Equipment Class Name'));
console.log(toCamelCase('under9score_name_format'));
console.log(toCamelCase('Enderscore_name_format'));
console.log(toCamelCase('EnderscoreBameFormat'));
console.log(toCamelCase('_EnderscoreBameFormat'));

http://jsbin.com/yageqi/1/edit?js,console

于 2014-12-16T16:54:51.610 回答
1
'it-is-a-great-day-today'.split('-').map(function(x,i){
    return (i?x[0].toUpperCase():x[0]) + x.slice(1).toLowerCase()
}).join('')

结果:

'itIsAGreatDayToday'

或者,.match(/\w+/g)而不是.split('-')- 取决于您在“this--is-a-test”等边缘情况下想要做什么。

于 2014-10-28T21:14:07.370 回答
1
var string = "it-is-a-great-day-today";
or
var string = "it_is_a_great_day_today";

var regex = /(_|-)([a-z])/g;

string.toLowerCase().replace(regex, toCamelCase );

function toCamelCase( string ){
  return string[1].toUpperCase();
}

Output: "itIsAGreatDayToday";
于 2015-06-18T22:16:37.790 回答
0

这是您可以用来测试此 http://jsfiddle.net/5n84w/2/的 jsfiddle

```

/**
 * Function to convert any string to camelCase
 * var regex = 'chetan-Ankola###.com---m13ok#-#alo(*finding!R%S#%-GFF'; 
 * Where [-_ .] is the seperator, you can add eg: '@' too
 * + is to handle repetition of seperator           
 * ? is to take care of preceeding token 
 * match nov(ember)? matches nov and november
 */
var camelCaser = function (str) {
    var camelCased = str.replace(/[-_ .]+(.)?/g, function (match, p) {
        if (p) {
            return p.toUpperCase();
        }
        return '';
    }).replace(/[^\w]/gi, '');
    return camelCased;
};

```

于 2014-03-07T21:08:15.613 回答
-1

最好做这个,伙计们,

function camelCase(data) {
    var tmp;
    if (data && typeof data === 'object') {
        forEach(data, function (value, key) {
            var tmpvalue = camelCase(key);
            tmp[tmpvalue] = value;
        });
        return tmp;
    } else {
        return data.toLowerCase().replace(/(\_\w)/g, function (m) { return m[1].toUpperCase() }).replace(/(\-\w)/g, function (m) { return m[1].toUpperCase(); });
    }
}

console.log(camelCase("SucCCCess_dfds_dsqsdqs-dsdqs-dqsdqs"));

在任何情况下都能完美运行。

于 2018-04-04T07:07:33.187 回答
-2
$scope.toCamelCase = function(arg){
    var arg = arg.toLowerCase();
    var arr = arg.split("");
    arr[0] = arr[0].toUpperCase();
    return arr.join("");
};
于 2014-12-10T20:38:30.057 回答