Làm thế nào để chuyển đổi camelCase Hướng tới trường hợp Camel Camel?


174

Tôi đã cố gắng để có được một lệnh regex JavaScript để biến một cái gì đó "thisString"thành "This String"nhưng thứ gần nhất tôi nhận được là thay thế một chữ cái, dẫn đến một cái gì đó giống như "Thi String"hoặc "This tring". Có ý kiến ​​gì không?

Để làm rõ, tôi có thể xử lý sự đơn giản của việc viết hoa một chữ cái, tôi không mạnh bằng RegEx và chia tách "somethingLikeThis"thành "something Like This"nơi tôi gặp khó khăn.



6
Làm thế nào đây là một bản sao của điều đó. Tất cả những gì làm là viết hoa ký tự đầu tiên trong một chuỗi, không có gì gần với những gì tôi muốn làm.
Một phù thủy đã làm điều đó

Hmm nó không phải là một bản sao của câu hỏi, nhưng kết quả có thể giống nhau. Hay đó không phải là những gì bạn muốn làm? Xây dựng thêm?
superfro

Đối với thực hành regex, tôi đề nghị RegExr hoặc Expresso kiểm tra và chỉ cần xem tất cả các câu hỏi regex trên SO và cố gắng trả lời chúng. Regex không phải là điều đơn giản nhất trên thế giới, nhưng chỉ cần nhớ rằng nếu regex của bạn gây nhầm lẫn cho BẠN thì hãy tách nó ra và làm việc thành từng mảnh.
josh.trow

Câu trả lời:


399
"thisStringIsGood"
    // insert a space before all caps
    .replace(/([A-Z])/g, ' $1')
    // uppercase the first character
    .replace(/^./, function(str){ return str.toUpperCase(); })

màn hình

This String Is Good


1
Người đàn ông tốt, tách nó ra. Chỉ cần nhớ lời khuyên của Bobince: stackoverflow.com/questions/1732348/ từ
josh.trow

Bạn có chắc chắn điều này tương thích với IE? Chỉ cần thử trong IETester7 và đã gặp lỗi.
strongriley

3
Ngoài ra, thêm: nếu bạn có một từ viết tắt mũ mà bạn muốn giữ lại với nhau, bạn có thể thay đổi biểu thức chính quy đầu tiên thành "/ ([AZ] [az]) /"
jackfrster

2
"This" -> "This" (không gian tiền tố không mong muốn). Có thể thay đổi nó thành: str.slice (0, 1) .toUpperCase () + str.slice (1) .replace (/ ([AZ]) / g, '$ 1')
Mark Vayngrib

1
@ColdCerberus Bạn có thể sử dụng: str.replace(/((?<!^)[A-Z](?![A-Z]))(?=\S)/g, ' $1').replace(/^./, s => s.toUpperCase() );Nó sẽ chuyển đổi userIDthành User IDvà thậm chí nó sẽ chuyển đổi userIDFieldthànhUser ID Field
Eugene Mala

87

Tôi có một mối quan tâm nhàn rỗi trong việc này, đặc biệt là trong việc xử lý các chuỗi thủ đô, chẳng hạn như trong xmlHTTPRequest. Các chức năng được liệt kê sẽ tạo ra "Yêu cầu HTTP Xml" hoặc "Xml HTTPRequest", của tôi tạo ra "Yêu cầu HTTP Xml".

function unCamelCase (str){
    return str
        // insert a space between lower & upper
        .replace(/([a-z])([A-Z])/g, '$1 $2')
        // space before last upper in a sequence followed by lower
        .replace(/\b([A-Z]+)([A-Z])([a-z])/, '$1 $2$3')
        // uppercase the first character
        .replace(/^./, function(str){ return str.toUpperCase(); })
}

Ngoài ra còn có phiên bản String.prototype trong một ý chính .


Điều tương tự có thể đạt được với 2 cuộc gọi thay thế:str.replace(/((?<!^)[A-Z](?![A-Z]))(?=\S)/g, ' $1').replace(/^./, s => s.toUpperCase() )
Eugene Mala

22

Điều này có thể được thực hiện chính xác với regex lookahead ( bản demo trực tiếp ):

function splitCamelCaseToString(s) {
    return s.split(/(?=[A-Z])/).join(' ');
}

(Tôi nghĩ rằng gcờ (toàn cầu) là cần thiết, nhưng thật kỳ lạ, nó không nằm trong trường hợp cụ thể này.)

Sử dụng lookahead với splitđảm bảo rằng chữ in hoa trùng khớp không bị tiêu thụ và tránh giao dịch với không gian hàng đầu nếu UpperCamelCase là thứ bạn cần xử lý. Để viết hoa chữ cái đầu tiên của mỗi chữ cái, bạn có thể sử dụng:

function splitCamelCaseToString(s) {
    return s.split(/(?=[A-Z])/).map(function(p) {
        return p.charAt(0).toUpperCase() + p.slice(1);
    }).join(' ');
}

Các mapphương pháp mảng là một tính năng ES5, nhưng bạn vẫn có thể sử dụng nó trong các trình duyệt cũ với một số mã từ MDC . Ngoài ra, bạn có thể lặp qua các phần tử mảng bằng forvòng lặp.


Hàm đầu tiên phân tách nó, nhưng không PascalCase từ đầu tiên. Chức năng thứ hai không thành công trong trường hợp không có camelCasing. (ví dụ: 'id')
Mất trí nhớ

16

Tôi nghĩ rằng điều này sẽ có thể xử lý các ký tự viết hoa liên tiếp cũng như camelCase đơn giản.

Ví dụ: someVariable => someVariable, nhưng ABCCode! = ABC Code.

Regex dưới đây hoạt động trên ví dụ của bạn nhưng cũng là ví dụ phổ biến về cách viết tắt trong camcelCase.

"somethingLikeThis"
    .replace(/([a-z])([A-Z])/g, '$1 $2')
    .replace(/([A-Z])([a-z])/g, ' $1$2')
    .replace(/\ +/g, ' ') => "something Like This"

"someVariableWithABCCode"
    .replace(/([a-z])([A-Z])/g, '$1 $2')
    .replace(/([A-Z])([a-z])/g, ' $1$2')
    .replace(/\ +/g, ' ') => "some Variable With ABC Code"

Bạn cũng có thể điều chỉnh như trên để viết hoa ký tự đầu tiên.


10
function spacecamel(s){
    return s.replace(/([a-z])([A-Z])/g, '$1 $2');
}

spacecamel ('SomethingLike This')

// giá trị trả về: một cái gì đó như thế này


1
Đẹp quá đây chính xác là những gì tôi cần tôi muốn chia ra, ví dụ: DiscoveryChannel và các câu trả lời khác của HBO đã cho tôi Discovery Channel và HBO, nhưng câu trả lời của bạn đã giúp tôi rất nhiều vì HBO vẫn nguyên vẹn cảm ơn bạn!
AJS



0

Nếu bạn không quan tâm đến các trình duyệt cũ hơn (hoặc không quan tâm đến việc sử dụng chức năng giảm dự phòng cho chúng), điều này có thể phân chia các chuỗi chẵn như 'xmlHTTPRequest' (nhưng chắc chắn là không thể thích 'XMLHTTPRequest').

function splitCamelCase(str) {
        return str.split(/(?=[A-Z])/)
                  .reduce(function(p, c, i) {
                    if (c.length === 1) {
                        if (i === 0) {
                            p.push(c);
                        } else {
                            var last = p.pop(), ending = last.slice(-1);
                            if (ending === ending.toLowerCase()) {
                                p.push(last);
                                p.push(c);
                            } else {
                                p.push(last + c);
                            }
                        }
                    } else {
                        p.push(c.charAt(0).toUpperCase() + c.slice(1));
                    }
                    return p;
                  }, [])
                  .join(' ');
}

0

Phiên bản của tôi

function camelToSpace (txt) {
  return txt
    .replace(/([^A-Z]*)([A-Z]*)([A-Z])([^A-Z]*)/g, '$1 $2 $3$4')
    .replace(/ +/g, ' ')
}
camelToSpace("camelToSpaceWithTLAStuff") //=> "camel To Space With TLA Stuff"

Tôi đã áp dụng chức năng này trong vòng lặp trên 3000 dòng và có những khoảng trống đó trước mỗi dòng bắt đầu bằng vốn
Dominik Domanski

0

Hãy thử giải pháp này tại đây -

var value = "myCamelCaseText";
var newStr = '';
for (var i = 0; i < value.length; i++) {
  if (value.charAt(i) === value.charAt(i).toUpperCase()) {
    newStr = newStr + ' ' + value.charAt(i)
  } else {
    (i == 0) ? (newStr += value.charAt(i).toUpperCase()) : (newStr += value.charAt(i));
  }
}
return newStr;

-5

Không phải regex, nhưng hữu ích để biết các kỹ thuật đơn giản và cũ như thế này:

var origString = "thisString";
var newString = origString.charAt(0).toUpperCase() + origString.substring(1);

5
không, câu hỏi là "thisString" thành "Chuỗi này" (có khoảng trắng) không phải "ThisString"
Pete Kirkham

@rob Làm thế nào để bạn đặt một khoảng trắng giữa "this" và "String"?
ThunderBird
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.