Dalam kode saya, saya membagi string berdasarkan _
dan ambil item kedua dalam array.
var element = $(this).attr('class');
var field = element.split('_')[1];
Membawa good_luck
dan memberi saya luck
. Bagus sekali!
Tapi, sekarang aku punya kelas yang mirip good_luck_buddy
. Bagaimana caranya agar javascript saya mengabaikan yang kedua _
dan memberi saya luck_buddy
?
Saya menemukan ini var field = element.split(new char [] {'_'}, 2);
dalam jawaban ac # stackoverflow tetapi tidak berhasil. Saya mencobanya di jsFiddle ...
sumber
_
dicocokkan di dalam grup penangkap, dan ditambahkan ke daftar token karena alasan itu."Aspect Ratio: 16:9".split(/:(.+)/)
out:["Aspect Ratio", " 16:9", ""]
": 16:9"
, tidak ada apa-apa setelah separator, sehingga menciptakan string kosong di akhir.Untuk apa Anda perlu ekspresi dan array reguler?
sumber
_
dengan menulis:myString.substring( myString.indexOf('_', myString().indexOf('_') + 1) + 1 )
var str = "good_luck_buddy", res = str.split(/_(.+)/);
Anda mendapatkan semua bagian:console.log(res[0]); console.log(res[1]);
[ string.substring(0, string.indexOf(options.divider)), string.substring(string.indexOf(options.divider) + 1) ]
Itu dia. Juga dengan dukungan jarum variabelSaya menghindari RegExp di semua biaya. Inilah hal lain yang dapat Anda lakukan:
sumber
Ganti instance pertama dengan placeholder unik lalu pisahkan dari sana.
Ini lebih berguna ketika kedua sisi dari perpecahan diperlukan.
sumber
Anda dapat menggunakan ekspresi reguler seperti:
Anda dapat menggunakan parameter kedua yang menentukan batas pemisahan. yaitu: var field = element.split ('_', 1) [1];sumber
'good_luck_buddy'.split('_', 1);
kembali hanya['good']
(:?.*)
seharusnya kelompok yang tidak menangkap? Jika demikian, seharusnya begitu(?:.*)
, tetapi jika Anda memperbaikinya Anda akan menemukannya tidak berfungsi lagi.(:?.*)
cocok dengan opsional:
diikuti oleh nol atau lebih dari karakter apa pun. Solusi ini akhirnya bekerja karena alasan yang sama dengan @ MarkF: semuanya setelah yang pertama_
ditambahkan ke daftar token karena cocok dengan grup penangkap. (Juga,g
pengubah tidak berpengaruh ketika digunakan dalam split regex.)Solusi ini berhasil untuk saya
ATAU
sumber
Saat
String.prototype.split
ini memang memungkinkan Anda untuk membatasi jumlah split.peringatan
Mungkin tidak bekerja seperti yang Anda harapkan. Saya berharap itu hanya akan mengabaikan sisa pembatas, tetapi alih-alih, ketika mencapai batas, itu memisahkan string yang tersisa lagi, menghilangkan bagian setelah pemisahan dari hasil pengembalian.
Saya berharap untuk:
sumber
String.split
Sayangnya Javascript tidak memiliki cara untuk membatasi jumlah split yang sebenarnya. Ini memiliki argumen kedua yang menentukan berapa banyak item split aktual dikembalikan, yang tidak berguna dalam kasus Anda. Solusinya adalah dengan membagi string, menggeser item pertama, lalu bergabung kembali dengan item yang tersisa ::sumber
Saya membutuhkan dua bagian string, jadi, lihat regex di belakang membantu saya dengan ini.
sumber
Dengan bantuan penugasan yang merusak, itu bisa lebih mudah dibaca:
sumber
Solusi tercepat?
Saya menjalankan beberapa tolok ukur , dan solusi ini menang sangat besar: 1
Perbandingan kinerja dengan solusi lain
Satu-satunya pesaing dekat adalah baris kode yang sama, kecuali menggunakan
substr
bukanslice
.Solusi lain yang saya coba libatkan
split
atauRegExp
mengalami kinerja besar dan sekitar 2 kali lipat lebih lambat. Menggunakanjoin
pada hasilsplit
, tentu saja, menambah penalti kinerja tambahan.Mengapa mereka lebih lambat? Setiap kali objek atau array baru harus dibuat, JS harus meminta sepotong memori dari OS. Proses ini sangat lambat.
Berikut adalah beberapa pedoman umum, jika Anda mengejar tolok ukur:
{}
atau array[]
(seperti yang dibuatsplit
) akan membutuhkan banyak biaya dalam kinerja.RegExp
pencarian lebih rumit dan karena itu lebih lambat daripada pencarian string.Menghapus di luar instance pertama
Inilah solusi yang akan mengiris hingga dan memasukkan instance ke-n. Ini tidak secepat, tetapi pada pertanyaan OP,
gobble(element, '_', 1)
masih> 2x lebih cepat dari solusiRegExp
atausplit
dan dapat melakukan lebih banyak:Dengan definisi di atas,
gobble('path/to/file.txt', '/')
akan memberikan nama file, dangobble('prefix_category_item', '_', 1)
akan menghapus awalan seperti solusi pertama dalam jawaban ini.sumber
Solusi Mark F luar biasa tetapi tidak didukung oleh peramban lama. Solusi Kennebec luar biasa dan didukung oleh browser lama tetapi tidak mendukung regex.
Jadi, jika Anda mencari solusi yang memecah string Anda hanya sekali, yang didukung oleh browser lama dan mendukung regex, inilah solusi saya:
sumber
Untuk pemula seperti saya yang tidak terbiasa dengan Ekspresi Reguler, solusi pemecahan masalah ini berfungsi:
Metode slice () mengekstraksi bagian string dan mengembalikan string baru dan metode indexOf () mengembalikan posisi kemunculan yang ditemukan pertama dari nilai yang ditentukan dalam string.
sumber
Gunakan
replace()
metode string dengan regex :Regex ini cocok dengan 0 atau lebih karakter sebelum yang pertama
_
, dan karakter_
itu sendiri. Pertandingan kemudian diganti dengan string kosong.sumber
document.body.innerHTML
sini sama sekali tidak berguna.document.body.innerHTML
?document.body
tergantung pada DOM untuk hadir dan tidak akan berfungsi pada lingkungan JavaScript murni.console.log
sudah cukup untuk tujuan ini atau cukup meninggalkan hasilnya dalam variabel untuk diperiksa.Ini bekerja untuk saya di Chrome + FF:
Jika Anda juga membutuhkan kunci coba ini:
sumber
Inilah satu RegExp yang melakukan trik.
Pertama itu memaksa pertandingan untuk memulai dari awal dengan '^'. Kemudian cocok dengan sejumlah karakter yang bukan '_', dengan kata lain semua karakter sebelum '_' pertama.
'?' berarti jumlah minimal karakter yang membuat seluruh kecocokan pola dicocokkan dengan '. *?' karena diikuti oleh '_', yang kemudian dimasukkan dalam pertandingan sebagai karakter terakhirnya.
Karenanya split ini () menggunakan bagian yang cocok sebagai 'splitter' dan menghapusnya dari hasil. Jadi itu menghapus semuanya sampai dan termasuk '_' pertama dan memberi Anda sisanya sebagai elemen ke-2 dari hasilnya. Elemen pertama adalah "" yang mewakili bagian sebelum bagian yang cocok. Itu "" karena pertandingan dimulai dari awal.
Ada RegExps lain yang berfungsi seperti /_(.*)/ yang diberikan oleh Chandu dalam jawaban sebelumnya.
/^.*?_/ memiliki manfaat yang bisa Anda pahami apa fungsinya tanpa harus tahu tentang peran khusus yang dimainkan kelompok dengan mengganti ().
sumber