Cara membagi string "Thequickbrownfoxjumps"
ke substring dengan ukuran yang sama di Jawa. Misalnya. "Thequickbrownfoxjumps"
dari 4 ukuran yang sama harus memberikan output.
["Theq","uick","brow","nfox","jump","s"]
Pertanyaan serupa:
Pisahkan string menjadi substring dengan panjang yang sama di Scala
Jawaban:
Berikut versi satu-baris regex:
\G
adalah pernyataan nol-lebar yang cocok dengan posisi di mana pertandingan sebelumnya berakhir. Jika ada itu tidak ada pertandingan sebelumnya, cocok dengan awal input, sama seperti\A
. Tampilan terlampir di belakang cocok dengan posisi yang terdiri dari empat karakter sejak akhir pertandingan terakhir.Keduanya terlihat di belakang dan
\G
merupakan fitur regex canggih, tidak didukung oleh semua rasa. Selain itu,\G
tidak diterapkan secara konsisten di seluruh rasa yang mendukungnya. Trik ini akan berfungsi (misalnya) di Java , Perl, .NET dan JGSoft, tetapi tidak dalam PHP (PCRE), Ruby 1.9+ atau TextMate (keduanya Oniguruma). JavaScript/y
(flag lengket) tidak sefleksibel\G
, dan tidak dapat digunakan dengan cara ini meskipun JS memang mendukung tampilan di belakang.Saya harus menyebutkan bahwa saya tidak selalu merekomendasikan solusi ini jika Anda memiliki opsi lain. Solusi non-regex dalam jawaban lain mungkin lebih lama, tetapi mereka juga mendokumentasikan diri sendiri; ini hanya kebalikan dari itu. ;)
Juga, ini tidak berfungsi di Android, yang tidak mendukung penggunaan tampilan
\G
di belakang.sumber
String.substring()
alih-alih regex, sementara membutuhkan beberapa baris kode tambahan, akan berjalan di suatu tempat dengan urutan 5x lebih cepat ...(?s)
di regex:(?s)(?<=\\G.{4})
.java.util.regex.PatternSyntaxException: Look-behind pattern matches must have a bounded maximum length
Yah, cukup mudah untuk melakukan ini dengan operasi aritmatika dan string sederhana:
Saya tidak berpikir itu benar-benar layak menggunakan regex untuk ini.
EDIT: Alasan saya untuk tidak menggunakan regex:
sumber
Splitter.fixedLength(4)
seperti yang disarankan oleh seanizer.Ini sangat mudah dengan Google Guava :
Keluaran:
Atau jika Anda membutuhkan hasilnya sebagai array, Anda dapat menggunakan kode ini:
Referensi:
Splitter.fixedLength()
Splitter.split()
Iterables.toArray()
Catatan: Konstruksi splitter ditunjukkan pada baris di atas, tetapi karena Splitter tidak dapat diubah dan dapat digunakan kembali, itu praktik yang baik untuk menyimpannya dalam konstanta:
sumber
String.join(separator, arrayOrCollection)
Jika Anda menggunakan perpustakaan serba guna jambu Google (dan sejujurnya, proyek Java baru mana pun seharusnya ), ini adalah hal sepele yang gila dengan kelas Splitter :
dan hanya itu . Semudah!
sumber
sumber
src.length()
danlen
keduanyaint
s, panggilan Andaceiling
tidak mencapai apa yang Anda inginkan - memeriksa bagaimana beberapa tanggapan lain melakukannya: (src.length () + len - 1) / lensumber
for
?for
loop memang pilihan penggunaan yang lebih 'alami' untuk ini :-) Terima kasih telah menunjukkan ini.Anda dapat menggunakan
substring
dariString.class
(menangani pengecualian) atau dari Apache lang commons (ini menangani pengecualian untuk Anda)Letakkan di dalam lingkaran dan Anda siap melakukannya.
sumber
substring
metode diString
kelas standar ?Saya lebih suka solusi sederhana ini:
sumber
substring
implementasinya berubah dengan Java 7, perbarui 6 pada pertengahan 2012, ketikaoffset
dancount
bidang dihapus dariString
kelas. Jadi kompleksitassubstring
beralih ke linear jauh sebelum jawaban ini dibuat. Tetapi untuk string kecil seperti contoh, itu masih berjalan cukup cepat dan untuk string yang lebih lama ... yah tugas ini jarang terjadi dalam praktek.Berikut ini adalah implementasi satu liner menggunakan stream Java8:
Ini memberikan output sebagai berikut:
sumber
String[] result = IntStream.range(0, (input.length()+3)/4) .mapToObj(i -> input.substring(i *= 4, Math.min(i + 4, input.length()))) .toArray(String[]::new);
Berikut ini adalah versi satu-baris yang menggunakan Java 8 IntStream untuk menentukan indeks awal irisan:
sumber
Jika Anda ingin membagi string sama mundur, yaitu dari kanan ke kiri, misalnya untuk membagi
1010001111
ke[10, 1000, 1111]
, inilah kodenya:sumber
saya menggunakan solusi java 8 berikut:
sumber
Solusi Java 8 (seperti ini tetapi sedikit lebih sederhana):
sumber
Saya bertanya kepada @Alan Moore dalam sebuah komentar atas solusi yang diterima bagaimana string dengan baris baru dapat ditangani. Dia menyarankan menggunakan DOTALL.
Menggunakan sarannya, saya membuat sampel kecil bagaimana itu bekerja:
Tapi saya suka solusi @Jon Skeets di https://stackoverflow.com/a/3760193/1237974 juga. Untuk pemeliharaan dalam proyek yang lebih besar di mana tidak semua orang sama-sama berpengalaman dalam ekspresi reguler, saya mungkin akan menggunakan solusi Jons.
sumber
Solusi brute force lainnya adalah,
Di mana kode hanya melangkah melalui string dengan substring
sumber
Hasil
sumber
sumber
Ini adalah versi saya berdasarkan aliran RegEx dan Java 8. Perlu disebutkan bahwa
Matcher.results()
metode ini tersedia sejak Java 9.Tes disertakan.
sumber
sumber
sumber