Sisipkan spasi sebelum huruf kapital


98

Saya memiliki tali "MySites". Saya ingin memberi spasi antara Mydan Sites.

Bagaimana saya bisa melakukan ini di jQuery atau JavaScript?


1
Bisakah Anda memberikan lebih banyak detail? Apa bentuk umum string yang ingin Anda pisahkan? Jika hanya satu string itu, mengapa tidak meletakkan spasi secara manual?
Pointy

2
Lebih tepatnya, saya rasa tidak ada yang bisa mengerti apa yang Anda tanyakan
Clement Herreman

1
tentukan pola yang harus cocok, misalnya "spasi ketika menemukan 'Saya' dalam string" atau "tambahkan spasi sebelum setiap karakter kapital, kecuali itu adalah karakter pertama", atau ....
JohnSmith

"antara MySites". Bagaimana Anda bisa menempatkan spasi di antara 1 benda? Saya berasumsi Anda menginginkan "Situs Saya" sebagai keluaran.
Roket Hazmat

#meagar - komentar bagus (sarkasme). tidakkah Anda pernah diajarkan bahwa jika Anda tidak memiliki sesuatu yang baik untuk dikatakan, jangan katakan apa-apa?
carinlynchin

Jawaban:


173

Anda bisa menambahkan spasi sebelum setiap karakter huruf besar dan memotong spasi di depan dan di belakangnya

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

Ini juga berfungsi untuk "1AndAbove". Solusi lainnya tidak. Terima kasih!!
One-One

1
Ini "gagal" untuk akronim, bagaimana kita bisa mencegahnya untuk bertindak ketika 2 atau lebih huruf besar berturut-turut?
Toni Michel Caubet

4
@ToniMichelCaubet mudah, memodifikasi regex seperti ini: /([A-Z]+)/g. Tanda + akan memastikan Anda mencocokkan sebanyak mungkin huruf kapital yang berurutan.
iFreilicht

Mengapa tanda kurung yang Anda gunakan untuk mengapit '[AZ]' diperlukan dalam kode ini?
Kristina Bressler

1
@KinaKurung mengatakan 'Saya adalah variabel'. Tanpa tanda kurung, itu menghasilkan jawaban '$ 1y $ 1ites' untuk 'MySites'
pengguna2051552

128

Ini akan menemukan setiap kemunculan karakter huruf kecil diikuti dengan karakter huruf besar, dan menyisipkan spasi di antaranya:

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

Untuk kasus khusus ketika 2 huruf kapital berturut-turut terjadi (Misalnya: ThisIsATest) tambahkan kode tambahan di bawah ini:

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

3
Sekadar peringatan, ini gagal karena satu huruf "ThisIsATest" akan menghasilkan "This Is ATest".
Ceres

3
@ Ceres: Poin bagus. Kasus itu dapat ditangani dengan menyisipkan spasi sebelum huruf besar apa pun yang bukan karakter pertama, tetapi Anda masih memiliki kasus yang tidak dapat ditangani tanpa pengenalan kata, seperti "RunThisSQLQuery".
Guffa

1
untuk "ThisIsATest" - (tidak termasuk 'RunThisSQLQuery') Anda dapat melakukan ini: str.replace (/ ([AZ]) / g, '$ 1'). trim ()
carinlynchin

Cemerlang! Terima kasih!
Ami Schreiber

22

Bolehkah saya menyarankan sedikit pengeditan pada jawaban yang diterima saat ini:

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

Artinya:

ACROText -> ACRO Text
UserNameTest -> User Name Test

Yang mungkin sedikit lebih berguna jika Anda berurusan dengan nama kolom db (Dan menggunakan akronim untuk beberapa hal)


1
Ini bekerja dengan sempurna untuk apa yang saya butuhkan. Itu dengan sempurna menambahkan spasi di antara huruf kapital tetapi tetap menyatukan akronim.
mighty_mite

6

Ini harus menyisipkan spasi di antara setiap huruf kapital yang tidak diawali dengan huruf kapital.

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];
}

newStringakan mendapatkan nilai yang Anda inginkan. Juga, jika Anda ingin mempersingkat kode Anda menggunakan regex, Anda dapat menggunakan kode berikut dari Javascript camelCase ke Regular Form

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


3

Inilah yang akhirnya saya gunakan untuk mengonversi string menjadi kasus judul, berdasarkan beberapa jawaban di sini:

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')   

Berikut adalah JSFiddle tempat Anda dapat menguji string Anda untuk melihat apakah ini memenuhi kebutuhan Anda: https://jsfiddle.net/thomastasa/5236dv8t/85/


Contoh:

  • "yourStringHere" -> "String Anda Di Sini"
  • "AnotherStringHere" -> "String Lain Di Sini"
  • "someones_string" -> "Someones String"
  • "Another-String-Here" -> "String Lain Di Sini"
  • "myAWESOMEString" -> "My AWESOME String"

1

Anda bisa menggunakan String#split()dan melihat ke depan untuk alfabet yang dikapitalisasi ( [A-Z]) dan kemudian Array#join()array dengan spasi:

let stringCamelCase = "MySites";

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

console.log(string)

Atau, sebagai fungsi Objek String:

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

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


1

Dalam satu regex, ganti (tanpa trim atau gabungan) yang memungkinkan karakter apa pun tidak hanya huruf [a-z]atau [A-Z].

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

Anda dapat memeriksa lebih lanjut tentang tampilan belakang di (?<!^) sini .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.