Chèn khoảng trắng trước chữ in hoa


96

Tôi có một chuỗi "MySites". Tôi muốn đặt một khoảng trống giữa MySites.

Làm cách nào để thực hiện việc này trong jQuery hoặc JavaScript?


1
Bạn có thể cung cấp một số chi tiết hơn? Dạng chung của các chuỗi bạn muốn tách là gì? Nếu chỉ có một chuỗi đó, tại sao không đặt dấu cách vào theo cách thủ công?
Pointy

2
Xin được chính xác hơn, tôi không nghĩ rằng bất cứ ai có thể hiểu những gì bạn đang yêu cầu
Clement Herreman

1
xác định mẫu mà nó phải khớp, ví dụ: "một khoảng trắng khi nó tìm thấy 'Của tôi' trong chuỗi" hoặc "thêm một khoảng trắng trước mỗi ký tự viết hoa, trừ khi nó là ký tự đầu tiên", hoặc ....
JohnSmith

"giữa các MySites". Làm thế nào bạn có thể đặt một khoảng cách giữa 1 thứ? Tôi giả sử bạn muốn "Trang web của tôi" làm đầu ra.
Rocket Hazmat

#meagar - bình luận hay (châm biếm). Có phải bạn đã từng dạy rằng nếu bạn không có gì tốt để nói, thì đừng nói gì cả sao?
carinlynchin,

Câu trả lời:


167

Bạn chỉ có thể thêm một khoảng trắng trước mỗi ký tự viết hoa và cắt bỏ khoảng trắng ở đầu và cuối

s = s.replace(/([A-Z])/g, ' $1').trim()

Điều này cũng hoạt động cho "1AndAbove". Các giải pháp khác thì không. Cảm ơn!!
desaivv

1
Nó "không thành công" đối với từ viết tắt, làm thế nào chúng ta có thể ngăn chặn nó hoạt động khi 2 hoặc nhiều chữ viết tắt liên tiếp?
Toni Michel Caubet,

4
@ToniMichelCaubet dễ dàng, sửa đổi regex như thế này: /([A-Z]+)/g. Dấu + sẽ đảm bảo bạn khớp càng nhiều chữ viết hoa liên tiếp càng tốt.
iFreilicht

Tại sao dấu ngoặc đơn mà bạn sử dụng để bao quanh '[AZ]' lại cần trong mã này?
Kristina Bressler,

1
@Kristina Dấu ngoặc đơn cho biết 'Tôi là một biến số'. Nếu không có ngoặc, nó mang lại câu trả lời '$ 1n $ 1ites' cho 'MySites'
user2051552

128

Điều này sẽ tìm thấy mỗi lần xuất hiện của một ký tự viết thường theo sau là một ký tự viết hoa và chèn một khoảng cách giữa chúng:

s = s.replace(/([a-z])([A-Z])/g, '$1 $2');

Đối với các trường hợp đặc biệt khi xuất hiện 2 chữ cái in hoa liên tiếp (Ví dụ: ThisIsATest), hãy thêm mã bổ sung bên dưới:

 s = s.replace(/([A-Z])([A-Z])/g, '$1 $2');

3
Chỉ là một cảnh báo, điều này không thành công đối với các chữ cái đơn lẻ "ThisIsATest" sẽ dẫn đến "This Is ATest".
Ceres

3
@Ceres: Điểm tốt. Trường hợp đó có thể được xử lý bằng cách chèn một khoảng trắng trước bất kỳ chữ hoa nào không phải là ký tự đầu tiên, nhưng bạn vẫn có những trường hợp không thể xử lý được nếu không nhận dạng từ, chẳng hạn như "RunThisSQLQuery".
Guffa

1
cho "ThisIsATest" - (không đếm 'RunThisSQLQuery'), bạn có thể làm điều này: str.replace (/ ([AZ]) / g, '$ 1') cắt ().
carinlynchin

Xuất sắc! Cảm ơn!
Ami Schreiber

21

Tôi có thể đề xuất một chỉnh sửa nhỏ cho câu trả lời hiện được chấp nhận:

function insertSpaces(string) {
    string = string.replace(/([a-z])([A-Z])/g, '$1 $2');
    string = string.replace(/([A-Z])([A-Z][a-z])/g, '$1 $2')
    return string;
}

Điều này có nghĩa rằng:

ACROText -> ACRO Text
UserNameTest -> User Name Test

Điều này có thể hữu ích hơn một chút nếu bạn đang xử lý tên cột db (Và đang sử dụng từ viết tắt cho một số thứ)


1
Điều này hoạt động hoàn hảo cho những gì tôi đang cần. Nó đã thêm một khoảng cách hoàn hảo giữa các chữ cái viết hoa nhưng vẫn giữ các từ viết tắt với nhau.
powers_mite

6

Điều này sẽ chèn một khoảng cách giữa mỗi chữ cái viết hoa mà không được viết hoa trước.

var myString = "MySites"
var newString = "";
var wasUpper = false;
for (var i = 0; i < myString.length; i++)
{
    if (!wasUpper && myString[i] == myString.toUpperCase()[i])
    {
        newString = newString + " ";
        wasUpper = true;
    }
    else
    {
        wasUpper = false;
    }
    newString = newString + myString[i];
}

newStringsẽ có giá trị bạn muốn. Ngoài ra, nếu bạn muốn rút ngắn mã của mình bằng cách sử dụng regex, bạn có thể sử dụng mã sau từ Javascript camelCase thành Biểu mẫu thông thường

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

5

regex để tìm chữ thường - ranh giới chữ hoa rồi chèn một khoảng trắng

<div id='x'>ThisIsMySites</div>
$('#x').text( $('#x').text().replace(/([a-z])([A-Z])/g, "$1 $2") );

http://jsfiddle.net/uXy64/


2

Đây là những gì tôi đã sử dụng để chuyển đổi một chuỗi thành một trường hợp tiêu đề, dựa trên một số câu trả lời ở đây:

str = str
  .replace(/(_|-)/g, ' ')
  .trim()
  .replace(/\w\S*/g, function(str) {
    return str.charAt(0).toUpperCase() + str.substr(1)
  })   
  .replace(/([a-z])([A-Z])/g, '$1 $2')
  .replace(/([A-Z])([A-Z][a-z])/g, '$1 $2')   

Đây là JSFiddle nơi bạn có thể kiểm tra chuỗi của mình để xem liệu điều này có đáp ứng nhu cầu của bạn hay không: https://jsfiddle.net/thomastasa/5236dv8t/85/


Ví dụ:

  • "yourStringHere" -> "Chuỗi của bạn ở đây"
  • "AnotherStringHere" -> "Một chuỗi khác ở đây"
  • "someones_string" -> "Someones String"
  • "Another-String-Here" -> "Another String Here"
  • "myAWESOMEString" -> "Chuỗi TUYỆT VỜI của tôi"

1

Bạn có thể sử dụng String#split()và xem trước bảng chữ cái viết hoa ( [A-Z]) và sau đó Array#join()là mảng có khoảng trắng:

let stringCamelCase = "MySites";

let string = stringCamelCase.split(/(?=[A-Z])/).join(" ");

console.log(string)

Hoặc, dưới dạng một hàm Đối tượng chuỗi:

String.prototype.cC2SC = function() {
  return this.split(/(?=[A-Z])/).join(" ");
}

console.log("MyCamelCase".cC2SC());


1

Trong một lần thay thế regex (không có dấu cắt hoặc nối) cho phép bất kỳ ký tự nào không chỉ chữ cái [a-z]hoặc [A-Z].

const str = "MySites";
str.replace(/(?<!^)([A-Z])/, " $1"); // -> "My Sites"

Bạn có thể kiểm tra thêm về giao diện phía sau (?<!^) tại đây .

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.