Apakah ada cara sederhana untuk mengubah string ke judul kasus? Misalnya john smith
menjadi John Smith
. Saya tidak mencari sesuatu yang rumit seperti solusi John Resig , hanya (semoga) semacam satu atau dua liner.
javascript
title-case
MDCore
sumber
sumber
Jawaban:
Coba ini:
sumber
\w\S*
digunakan, bukan\w+
atau\w*
misalnya? Saya tidak tahu, mengapa Anda ingin memasukkan apa pun selain spasi dan karenanya mengubah Jim-Bob menjadi Jim-bob .\w\S*
juga menyebabkanJim-bob
masalah pada kami. Menggunakan\w*
diselesaikan ini./([^\W_]+[^\s-]*) */g
memecahkanJim-Bob
masalah, yaitu:jim-bob
-->
Jim-Bob
jim-bob
-->
Jim-Bob
itu keinginan Anda, mungkin sebaiknya Anda lakukan/\b\w+/g
. Contoh:str.replace(/\b\w+/g,function(s){return s.charAt(0).toUpperCase() + s.substr(1).toLowerCase();});
\w\S*
digunakan sebagai ganti\w+
atau\w*
agar kata-kata sepertiDon't
tidak dapat dimodifikasiDon'T
, tetapi seperti yang orang lain katakan\w\S*
menyebabkan masalah dengan kata-kata yang ditulis dgn tanda penghubung.Cara yang sedikit lebih elegan, mengadaptasi fungsi Greg Dean:
Sebut saja seperti:
sumber
Jo-Ann Smith
, kode ini akan mengubahnya menjadiJo-ann Smith
(perhatikan huruf kecila
diAnn
).Cobalah untuk menerapkan gaya CSS transformasi teks ke kontrol Anda.
misalnya:
(text-transform: capitalize);
Hanya gunakan pendekatan JS jika benar-benar diperlukan.
sumber
Ini versi saya, IMO juga mudah dimengerti dan elegan.
sumber
str.split(' ').map(i => i[0].toUpperCase() + i.substring(1).toLowerCase()).join(' ')
.toLowerCase()
. Nama-nama seperti "McDonald" atau akronim seperti "ASAP" harus mempertahankan karakter huruf besar mereka. Jika seseorang benar-benar mengirimkan string seperti "heLLO", aplikasi seharusnya tidak menganggap huruf besar salah.String.prototype.toTitleCase = function (blnForceLower) { var strReturn; (blnForceLower ? strReturn = this.toLowerCase() : strReturn = this); return strReturn .split(' ') .map(i => i[0].toUpperCase() + i.substr(1)) .join(' '); }
str
karakter tunggal.Inilah fungsi saya yang mengonversi ke case title tetapi juga mempertahankan akronim yang didefinisikan sebagai huruf besar dan kata-kata kecil sebagai huruf kecil:
Sebagai contoh:
sumber
/\w\S*/g
menjadi/([^\W_]+[^\s-]*) */g
per @ awashburn komentar di atas untuk mengatasi ini./\b\w+/g
, yang menurut saya lebih cepat dipahami?/([^\W_]+[^\s-]*) */g
menjadi/\b\w+/g
per @ Michael's komentar; tolong beri komentar jika Anda menemukan kasus di mana regex yang lebih rumit diperlukan./\b[\w-\']+/g
untuk memungkinkan kata ditulis dgn tanda penghubung dan apostrof dalam kata-kata.Saya lebih suka yang berikut daripada jawaban lainnya. Hanya cocok dengan huruf pertama dari setiap kata dan huruf besar. Kode lebih sederhana, lebih mudah dibaca dan lebih sedikit byte. Ini mempertahankan huruf kapital yang ada untuk mencegah akronim yang menyimpang. Namun Anda selalu dapat memanggil
toLowerCase()
string Anda terlebih dahulu.Anda dapat menambahkan ini ke prototipe string yang memungkinkan Anda melakukan hal
'my string'.toTitle()
berikut:Contoh:
Tampilkan cuplikan kode
sumber
const titleCase = (str) => str.replace(/\b\S/g, t => t.toUpperCase());
NoT qUiITe
.toLowerCase
. Ketahuilah bahwa itu akan merusak akronim.an HTML document
:An HTML Document
vsAn Html Document
toLowerCase
) lebih fleksibel / berguna daripada yang mengasumsikan niat pengembang. Metode ini juga mencerminkan fungsionalitas metodeucwords
bawaan serupa dari bahasa lain seperti PHP ( ) dan Golang (strings.Title
). .NET (TextInfo.ToTitleCase
) menariknya berfungsi untuk case campuran, tetapi juga tidak akan mengubah string dengan huruf kapital penuh.Tanpa menggunakan regex hanya untuk referensi:
sumber
sumber
'string'.replace(/^(.)(.*)/,function(s,p1,p2){return p1.toUpperCase()+p2;})
lagi, ini hanya berfungsi untuk huruf besar dari string, tetapi jika itu yang Anda butuhkan, konstruksi saya berfungsi.'$1'.toUpperCase()
, tampaknya huruf besar belum selesai pada saat nilai ditugaskan. Bekerja di sekitar dengan menggunakan fungsi'string'.replace(/^(.){1}/,function(match) { return match.toUpperCase(); })
Anda dapat langsung
toLowerCase
membuat string, dan kemudian hanyatoUpperCase
huruf pertama dari setiap kata. Menjadi 1 liner yang sangat sederhana:sumber
s => s.toUpperCase()
). Varian saya adalah melakukan apa yang telah Anda lakukan, tetapi memperluas objek String (sama kontroversialnya dengan itu):Object.defineProperty(String.prototype, '_toProperCase', {value:function() {return this.toLowerCase().replace(/\b(\w)/g, function(t) {return t.toUpperCase()})}})
=>
, yaitu fungsi panah asli (ES6), tautan melompat ke Mozillla Docs pada mereka yang juga menyediakan tabel dukungan.Kalau-kalau Anda khawatir tentang kata-kata pengisi, Anda selalu dapat hanya memberitahu fungsi apa yang tidak untuk memanfaatkan.
Semoga ini bisa membantu Anda.
sunting
Jika Anda ingin menangani kata lem terkemuka, Anda dapat melacak ini dengan satu variabel lagi:
sumber
glue ='de|da|del|dos|do|das|des|la|della|delli'.split('|');
and another thing
menjadiand Another Thing
. Hanya perlu cara yang elegan untuk selalu memanfaatkan huruf pertama.Jika regex yang digunakan dalam solusi di atas membuat Anda bingung, coba kode ini:
sumber
split
tidak mengubahnya menjadi sebuah array, Anda hanya tidak melihatnya sebagai jelas karenamap
berarti Anda tidak perlu menggunakan[]
notasiSaya membuat fungsi ini yang dapat menangani nama belakang (jadi bukan judulnya) seperti "McDonald" atau "MacDonald" atau "O'Toole" atau "D'Orazio". Namun itu tidak menangani nama Jerman atau Belanda dengan "van" atau "von" yang sering kali dalam huruf kecil ... Saya percaya "de" sering kali lebih rendah juga seperti "Robert de Niro". Ini masih harus ditangani.
sumber
macy
masalah dengan menempatkan kepala pencarian negatif di sana sehingga\b((m)(a?c))?(\w)
menjadi\b((m)(a?c))?(\w)(?!\s)
Tampaknya bekerja ... Diuji dengan di atas, "rubah cepat berwarna coklat, rubah? / Melompati ^ si malas! Anjing ..." dan "C: / file program / beberapa vendor / aplikasi kedua / a file1.txt ".
Jika Anda menginginkan 2Nd bukannya 2, Anda dapat mengubah ke
/([a-z])(\w*)/g
.Bentuk pertama dapat disederhanakan sebagai:
sumber
Coba ini
Contoh
sumber
Jika Anda dapat menggunakan perpustakaan pihak ketiga dalam kode Anda maka lodash memiliki fungsi pembantu bagi kami.
https://lodash.com/docs/4.17.3#startCase
sumber
Coba ini, cara terpendek:
sumber
ES 6
lain
sumber
s.slice(0, 1).toUpperCase()
jika Anda masih menginginkan surat pertama itu.str
adalah karakter tunggal.charAt(0).toUpperCase()
.Sebagian besar jawaban ini tampaknya mengabaikan kemungkinan menggunakan kata batas metacharacter (\ b). Versi pendek dari jawaban Greg Dean memanfaatkannya:
Bekerja untuk nama yang ditulis dgn tanda penghubung seperti Jim-Bob juga.
sumber
\w
hanya menyertakan karakter[A-Za-z0-9_]
, tidak semua huruf. Untuk itu Anda harus menggunakan kategori Unicode\p{L}
. Anda memerlukan/u
pengubah (lihat di sini ) dan solusi berbeda\b
, yang hanya berfungsi di antara\W
dan\w
(lihat di sini )Saya pikir yang paling sederhana adalah menggunakan css.
sumber
Gunakan
/\S+/g
untuk mendukung diakritik:Namun: " s unshine ( y ellow)" ⇒ " S unshine ( y ellow)"
sumber
Saya ingin menambahkan jawaban saya sendiri karena saya membutuhkan
toTitleCase
fungsi yang kuat yang memperhitungkan aturan tata bahasa yang tercantum di sini (artikel yang direkomendasikan Google). Ada berbagai aturan yang bergantung pada panjang string input. Di bawah ini adalah tes fungsi + unit.Fungsi ini juga mengkonsolidasikan spasi putih dan menghapus karakter khusus (memodifikasi regex untuk kebutuhan Anda)
Fungsi toTitleCase
Unit Tes untuk Memastikan Kebenaran
Harap dicatat bahwa saya menghapus sedikit karakter khusus dari string yang disediakan. Anda perlu mengubah regex untuk memenuhi persyaratan proyek Anda.
sumber
sumber
o'henry
, tetapi melakukan hal-hal aneh denganhorse's mouth
."john f. kennEdy".toLowerCase().replace(/\b\S/g, t => t.toUpperCase())
lebih baik 🤔\b
dan\S
adalah kelas karakter khusus yang menunjukkan "batas kata" dan "tunggal, karakter bukan spasi. Jadi, regex cocok dengan setiap karakter tunggal mengikuti batas kata, dan memanfaatkan karakter itu dengan menerapkan fungsi panah yang diberikan.Mengambil solusi "lewax00", saya menciptakan solusi sederhana ini yang memaksa "w" dimulai dengan spasi atau "w" yang memulai kata, tetapi tidak dapat menghapus ruang perantara tambahan.
Hasilnya adalah "SofĂa Vergara".
sumber
Inilah fungsi saya yang menangani karakter beraksen (penting untuk bahasa Prancis!) Dan yang dapat menghidupkan / mematikan penanganan pengecualian yang lebih rendah. Semoga itu bisa membantu.
sumber
Kami telah melakukan diskusi di sini di kantor dan kami berpikir bahwa mencoba untuk secara otomatis memperbaiki cara orang memasukkan nama dengan cara yang Anda inginkan saat ini penuh dengan kemungkinan masalah.
Kami telah menemukan beberapa kasus di mana berbagai jenis kapitalisasi otomatis berantakan dan ini hanya untuk nama bahasa Inggris saja, setiap bahasa memiliki kompleksitasnya sendiri.
Masalah dengan huruf besar huruf pertama dari setiap nama:
• Akronim seperti IBM tidak diizinkan dimasukkan, akan berubah menjadi Ibm.
• Nama McDonald akan berubah menjadi Mcdonald yang tidak benar, hal yang sama juga MacDonald.
• Nama ganda laras seperti Marie-Tonks akan berubah menjadi Marie-tonks.
• Nama seperti O'Connor akan berubah menjadi O'connor.
Untuk sebagian besar dari ini, Anda dapat menulis aturan khusus untuk menghadapinya, namun, ini masih memiliki masalah dengan Akronim seperti sebelumnya dan Anda mendapatkan masalah baru:
• Menambahkan aturan untuk memperbaiki nama dengan Mac seperti MacDonald, akankah nama-nama seperti Macy mengubahnya menjadi MacY.
Satu-satunya solusi yang kami temukan yang tidak pernah salah adalah dengan memanfaatkan setiap huruf yang merupakan metode brute force yang tampaknya juga digunakan DBS.
Jadi, jika Anda ingin mengotomatiskan prosesnya, sama baiknya tidak mungkin dilakukan tanpa kamus dari setiap nama dan kata tunggal dan bagaimana itu harus dikapitalisasi, Jika Anda tidak memiliki aturan yang mencakup segala sesuatu jangan menggunakannya seperti itu hanya akan mengganggu pengguna Anda dan meminta orang yang ingin memasukkan nama mereka dengan benar untuk pergi ke tempat lain.
sumber
inilah solusi lain menggunakan css (dan javascript, jika teks yang ingin Anda ubah ada dalam huruf besar):
html
js
css
sumber
Bagi kita yang takut dengan ekspresi reguler (tertawa):
sumber
Solusi satu baris saya:
Kemudian, Anda dapat memanggil metode
capitalizeWords()
pada sembarang string. Sebagai contoh:Solusi saya yang lain:
Kemudian, Anda dapat memanggil metode
capitalizeWords()
pada sembarang string. Sebagai contoh:Solusi alternatif berdasarkan jawaban Greg Dean:
Kemudian, Anda dapat memanggil metode
capitalizeWords()
pada sembarang string. Sebagai contoh:sumber
Terkejut melihat tidak ada yang menyebutkan penggunaan parameter sisanya. Berikut ini adalah liner sederhana yang menggunakan parameter ES6 Rest.
sumber
Ini didasarkan pada solusi saya untuk Bonfire "Title Case" FreeCodeCamp , yang mengharuskan Anda untuk terlebih dahulu mengonversi string yang diberikan ke semua huruf kecil dan kemudian mengonversi setiap karakter yang melanjutkan spasi ke huruf besar.
Tanpa menggunakan regex:
sumber