Chuyển đổi dấu gạch nối sang trường hợp lạc đà (camelCase)


146

Với regex (tôi giả sử) hoặc một số phương thức khác, làm thế nào tôi có thể chuyển đổi những thứ như:

marker-imagehoặc my-example-settingđến markerImagehoặc myExampleSetting.

Tôi đã suy nghĩ về việc chỉ cần tách bằng cách -sau đó chuyển đổi chỉ mục của hypen +1 đó thành chữ hoa. Nhưng nó có vẻ khá bẩn và hy vọng một số trợ giúp với regex có thể làm cho mã sạch hơn.

Không có jQuery ...


1
Bản sao chính xác của JavaScript RegExp $ 1 sang chữ hoa
mplungjan

7
Nó thực sự, nhưng tôi đã tìm kiếm và không bao giờ tìm thấy nó có lẽ là do tên tối nghĩa. Id đề nghị giữ điều này mở để mọi người thực sự có thể tìm thấy câu trả lời. "RegExp $ 1 thành chữ hoa" ... không ai sẽ tìm thấy nó trừ khi họ đã biết regex IMO
Oscar Godson

Điều đó đã dễ dàng sửa chữa. Tôi vừa chỉnh sửa tiêu đề
mplungjan

Vì vậy, việc cắt và dán các giải pháp sẽ giúp tôi có câu trả lời được chấp nhận: |
mplungjan

Có cách nào để làm điều ngược lại chính xác?
Pavan

Câu trả lời:


258

Thử cái này:

var camelCased = myString.replace(/-([a-z])/g, function (g) { return g[1].toUpperCase(); });

Biểu thức chính quy sẽ khớp với -itrong marker-imagevà chỉ chụp i. Điều này sau đó được đặt trong hàm gọi lại và được thay thế.


53
FYI, đây là điều ngược lại:myString.replace(/([a-z][A-Z])/g, function (g) { return g[0] + '-' + g[1].toLowerCase() });
Cyril N.

Tôi nghĩ rằng tham số nên được đổi tên thành "m", như "khớp". Người ta có thể nhanh chóng viết một cái gì đó như: myString.replace(/-([a-z])/i, function (i) { return i[1].toUpperCase() });
chương trình

8
Sẽ là một ý tưởng tốt để làm cho regex của bạn mạnh mẽ hơn bằng cách thêm icờ. Không có nó, mẫu của bạn sẽ bỏ lỡ "phần được viết hoa" (sẽ không được đổi thành "capitalizedParts"). Ngoài ra, cá nhân tôi thích khả năng đọc được cải thiện của nhiều tham số, nhưng đó rõ ràng là vấn đề về kiểu dáng. Tất cả trong tất cả, tôi đi với .replace( /-([a-z])/gi, function ( $0, $1 ) { return $1.toUpperCase(); } );.
trao đổi

Để thêm vào điều này, nếu bạn muốn tách từ không gian trường hợp lạc đà , các cách sau đây sẽ hoạt động:var camelCased = myString.replace(/(-+|\s+)\w/g, function (g) { return g[1].toUpperCase(); });
wolfram77

@ wolfram77, Bạn bao gồm nhiều dấu gạch ngang / ký tự dấu cách trong biểu thức chính quy, sau đó viết hoa ký tự thứ hai của trận đấu, nghĩa là nếu ký tự thứ hai là dấu cách hoặc dấu gạch ngang, thì đó là ký tự được đặt ở trên. Làm thế nào về điều này : var camelCased = myString.replace(/(-+|\s+)\w/g, function (g) { return g[g.length - 1].toUpperCase(); });?
phân chia

44

Đây là một trong những tiện ích tuyệt vời mà Lodash cung cấp nếu bạn đã giác ngộ và có nó trong dự án của bạn.

var str = 'my-hyphen-string';
str = _.camelCase(str);
// results in 'myHyphenString'

14

Bạn có thể lấy hypen và ký tự tiếp theo và thay thế nó bằng phiên bản cấp trên của nhân vật:

var str="marker-image-test";
str.replace(/-([a-z])/g, function (m, w) {
    return w.toUpperCase();
});

3
Thật tuyệt - Tôi đã sử dụng phương pháp này nhưng ES6'd nó vào >> str.replace (/ - ([az]) / g, (x, up) => up.toUpperCase ())
ConorLuddy

13

Đây là phiên bản chức năng camelCase của tôi:

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);
    };
})();

Nó xử lý tất cả các trường hợp cạnh sau:

  • mặc định chăm sóc cả dấu gạch dưới và dấu gạch nối (cấu hình với tham số thứ hai)
  • chuỗi với các ký tự unicode
  • chuỗi kết thúc bằng dấu gạch nối hoặc dấu gạch dưới
  • chuỗi có dấu gạch nối hoặc dấu gạch dưới liên tiếp

Đây là một liên kết đến các bài kiểm tra trực tiếp: http://jsfiddle.net/avKzf/2/

Dưới đây là kết quả từ các bài kiểm tra:

  • đầu vào: "ab-cd-ef", kết quả: "abCdEf"
  • đầu vào: "ab-cd-ef-", kết quả: "abCdEf"
  • đầu vào: "ab-cd-ef--", kết quả: "abCdEf"
  • đầu vào: "ab-cd - ef--", kết quả: "abCdEf"
  • đầu vào: "--ab-cd - ef--", kết quả: "AbCdEf"
  • đầu vào: "--ab-cd -__- ef--", kết quả: "AbCdEf"

Lưu ý rằng các chuỗi bắt đầu bằng dấu phân cách sẽ dẫn đến một chữ cái viết hoa ở đầu. Nếu đó không phải là những gì bạn mong đợi, bạn luôn có thể sử dụng lcfirst. Đây là lcfirst của tôi nếu bạn cần nó:

function lcfirst(str) {
    return str && str.charAt(0).toLowerCase() + str.substring(1);
}

4

Điều này không hét lên cho RegExptôi. Cá nhân tôi cố gắng tránh các biểu thức chính quy khi các phương thức chuỗi và mảng đơn giản sẽ đủ:

let upFirst = word => 
  word[0].toUpperCase() + word.toLowerCase().slice(1)

let camelize = text => {
  let words = text.split(/[-_]/g) // ok one simple regexp.
  return words[0].toLowerCase() + words.slice(1).map(upFirst)
}

camelize('marker-image') // markerImage

1

Đây là một tùy chọn khác kết hợp một vài câu trả lời ở đây và làm cho nó thành phương thức trên một chuỗi:

if (typeof String.prototype.toCamel !== 'function') {
  String.prototype.toCamel = function(){
    return this.replace(/[-_]([a-z])/g, function (g) { return g[1].toUpperCase(); })
  };
}

Được sử dụng như thế này:

'quick_brown'.toCamel(); // quickBrown
'quick-brown'.toCamel(); // quickBrown

1
// Turn the dash separated variable name into camelCase.
str = str.replace(/\b-([a-z])/g, (_, char) => char.toUpperCase());

1

Bạn có thể sử dụng lạc đà từ NPM.

npm install --save camelcase

const camelCase = require('camelcase');
camelCase('marker-image'); // => 'markerImage';
camelCase('my-example-setting'); // => 'myExampleSetting';

0

Một mất khác.

Được sử dụng khi ...

var string = "hyphen-delimited-to-camel-case"
or
var string = "snake_case_to_camel_case"


function toCamelCase( string ){
  return string.toLowerCase().replace(/(_|-)([a-z])/g, toUpperCase );
}

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

Output: hyphenDelimitedToCamelCase

0

cũng có thể sử dụng indexOf với đệ quy cho tác vụ đó.

input some-foo_sd_dsd-weqe
output someFooSdDsdWeqe

so sánh ::: đo thời gian thực hiện cho hai tập lệnh khác nhau:

$ node camelCased.js
someFooSdDsdWeqe
test1: 2.986ms
someFooSdDsdWeqe
test2: 0.231ms

mã:

console.time('test1');
function camelCased (str) {

        function check(symb){

            let idxOf = str.indexOf(symb);
            if (idxOf === -1) {
                return str;
            }

            let letter = str[idxOf+1].toUpperCase();
            str = str.replace(str.substring(idxOf+1,idxOf+2), '');
            str = str.split(symb).join(idxOf !== -1 ? letter : '');

            return camelCased(str);
        }       

        return check('_') && check('-');

    }

console.log(camelCased ('some-foo_sd_dsd-weqe'));
console.timeEnd('test1');



console.time('test2');

    function camelCased (myString){
     return myString.replace(/(-|\_)([a-z])/g, function (g) { return  g[1].toUpperCase(); });
   }


console.log(camelCased ('some-foo_sd_dsd-weqe'));
console.timeEnd('test2');

0

Chỉ là một phiên bản có cờ, cho vòng lặp và không có Regex:

function camelCase(dash) { 

  var camel = false;
  var str = dash;
  var camelString = '';

  for(var i = 0; i < str.length; i++){
    if(str.charAt(i) === '-'){
      camel = true;

    } else if(camel) {
      camelString += str.charAt(i).toUpperCase();
      camel = false;
    } else {
      camelString += str.charAt(i);
    }
  } 
  return camelString;
}

0

Đây là cách thực hiện của tôi (chỉ để làm bẩn tay)

/**
 * kebab-case to UpperCamelCase
 * @param {String} string
 * @return {String}
 */
function toUpperCamelCase(string) {
  return string
    .toLowerCase()
    .split('-')
    .map(it => it.charAt(0).toUpperCase() + it.substr(1))
    .join('');
}

0

Sử dụng điều này nếu bạn cho phép số trong chuỗi của bạn.

Rõ ràng các phần bắt đầu bằng một số sẽ không được viết hoa, nhưng điều này có thể hữu ích trong một số trường hợp.

function fromHyphenToCamelCase(str) {
  return str.replace(/-([a-z0-9])/g, (g) => g[1].toUpperCase())
}

function fromHyphenToCamelCase(str) {
  return str.replace(/-([a-z0-9])/g, (g) => g[1].toUpperCase())
}

const str1 = "category-123";
const str2 = "111-222";
const str3 = "a1a-b2b";
const str4 = "aaa-2bb";

console.log(`${str1} => ${fromHyphenToCamelCase(str1)}`);
console.log(`${str2} => ${fromHyphenToCamelCase(str2)}`);
console.log(`${str3} => ${fromHyphenToCamelCase(str3)}`);
console.log(`${str4} => ${fromHyphenToCamelCase(str4)}`);

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.