Seperti judulnya, saya punya string dan saya ingin membagi menjadi segmen n karakter.
Sebagai contoh:
var str = 'abcdefghijkl';
setelah beberapa sihir dengan n=3
, itu akan menjadi
var arr = ['abc','def','ghi','jkl'];
Apakah ada cara untuk melakukan ini?
[\s\S]
alih-alih.
agar tidak gagal di baris baru.''.match(/.{1,3}/g)
dan''.match(/.{3}/g)
kembalinull
sebagai ganti array kosong.Jika Anda tidak ingin menggunakan ekspresi reguler ...
jsFiddle .
... kalau tidak solusi regex cukup bagus :)
sumber
3
variabel seperti yang disarankan oleh OP. Ini lebih mudah dibaca daripada menggabungkan string regexp.sumber
3
saya tetapi kembalinull
dengan250
. 🤔Membangun jawaban sebelumnya untuk pertanyaan ini; fungsi berikut akan membagi string (
str
) n-number (size
) karakter.Demo
sumber
Solusi saya (sintaks ES6):
Kami bahkan dapat membuat fungsi dengan ini:
Kemudian Anda dapat memanggil fungsi dengan mudah dengan cara yang dapat digunakan kembali:
Bersulang
sumber
Solusi bersih tanpa REGEX
sumber
Fungsi di atas adalah apa yang saya gunakan untuk Base64 chunking. Itu akan membuat satu baris 75 karakter.
sumber
replace(/.{1,75}/g, '$&\n')
.Di sini kita menyelingi string dengan string lain setiap n karakter:
jika kita menggunakan cara di atas seperti ini:
kita mendapatkan:
dan di sini kita melakukan hal yang sama, tetapi dorong ke array:
dan kemudian jalankan:
kita mendapatkan:
jika seseorang mengetahui cara untuk menyederhanakan kode di atas, lmk, tetapi harus berfungsi dengan baik untuk string.
sumber
Beberapa solusi bersih tanpa menggunakan ekspresi reguler:
Contoh penggunaan - https://jsfiddle.net/maciejsikora/b6xppj4q/ .
Saya juga mencoba membandingkan solusi saya dengan regexp yang dipilih sebagai jawaban yang benar. Beberapa tes dapat ditemukan di jsfiddle - https://jsfiddle.net/maciejsikora/2envahrk/ . Pengujian menunjukkan bahwa kedua metode memiliki kinerja yang sama, mungkin pada solusi regexp tampilan pertama sedikit lebih cepat, tetapi menilai sendiri.
sumber
Dengan
.split
:dan
.replace
akan:/(?!$)/
adalah untuk berhenti sebelum akhir/$/
, tanpa adalah:mengabaikan grup
/(?:
...)/
tidak perlu di.replace
tetapi di.split
menambahkan grup ke arr:sumber
Berikut cara untuk melakukannya tanpa ekspresi reguler atau loop eksplisit, meskipun sedikit memperluas definisi liner:
Ini bekerja dengan memisahkan string menjadi array karakter individu, lalu gunakan
Array.reduce
untuk beralih ke setiap karakter. Biasanyareduce
akan mengembalikan nilai tunggal, tetapi dalam kasus ini nilai tunggal terjadi menjadi array, dan ketika kami melewati setiap karakter kita menambahkannya ke item terakhir dalam array itu. Setelah item terakhir dalam array mencapai panjang target, kami menambahkan item array baru.sumber
Beberapa saat kemudian untuk diskusi tetapi di sini variasi yang sedikit lebih cepat daripada dorongan substring + array.
Pra-menghitung nilai akhir sebagai bagian dari for loop lebih cepat daripada melakukan inline math di dalam substring. Saya sudah mengujinya di Firefox dan Chrome dan keduanya menunjukkan peningkatan.
Anda bisa mencobanya di sini
sumber