Hanya menggunakan metode yang sesuai: String#split()
.
String string = "004-034556";
String[] parts = string.split("-");
String part1 = parts[0]; // 004
String part2 = parts[1]; // 034556
Perhatikan bahwa ini membutuhkan ekspresi reguler , jadi ingatlah untuk menghindar dari karakter khusus jika perlu.
ada 12 karakter dengan makna khusus: garis miring terbalik \
, tanda sisipan ^
, tanda dolar $
, titik atau titik .
, tanda garis vertikal atau pipa |
, tanda tanya ?
, tanda bintang atau bintang *
, tanda tambah +
, tanda kurung pembuka (
, tanda kurung penutup )
, dan kurung siku [
pembuka {
, kurung kurawal pembuka , Karakter khusus ini sering disebut "metacharacters".
Jadi, jika Anda ingin membagi misalnya periode / titik .
yang berarti " karakter apa pun " di regex, gunakan backslash\
untuk melarikan diri dari karakter khusus individu seperti itu split("\\.")
, atau gunakan kelas karakter[]
untuk mewakili karakter literal seperti itu split("[.]")
, atau gunakan Pattern#quote()
untuk lepaskan seluruh string seperti itu split(Pattern.quote("."))
.
String[] parts = string.split(Pattern.quote(".")); // Split on period.
Untuk menguji sebelumnya jika string berisi karakter tertentu, gunakan saja String#contains()
.
if (string.contains("-")) {
// Split it.
} else {
throw new IllegalArgumentException("String " + string + " does not contain -");
}
Catatan, ini tidak mengambil ekspresi reguler. Untuk itu, gunakan String#matches()
saja.
Jika Anda ingin mempertahankan karakter pemisah di bagian yang dihasilkan, maka manfaatkan pencarian positif . Jika Anda ingin memiliki karakter split berakhir di sisi kiri, gunakan tampilan positif di belakang dengan mengawali ?<=
grup pada pola.
String string = "004-034556";
String[] parts = string.split("(?<=-)");
String part1 = parts[0]; // 004-
String part2 = parts[1]; // 034556
Jika Anda ingin memiliki karakter split untuk berakhir di sisi kanan, gunakan lookahead positif dengan awalan ?=
grup pada polanya.
String string = "004-034556";
String[] parts = string.split("(?=-)");
String part1 = parts[0]; // 004
String part2 = parts[1]; // -034556
Jika Anda ingin membatasi jumlah bagian yang dihasilkan, maka Anda dapat memberikan angka yang diinginkan sebagai argumen ke-2 split()
metode.
String string = "004-034556-42";
String[] parts = string.split("-", 2);
String part1 = parts[0]; // 004
String part2 = parts[1]; // 034556-42
reugalr expression
mengembalikan satu elemen array dengan seluruh string.Alternatif untuk memproses string secara langsung adalah dengan menggunakan ekspresi reguler dengan menangkap grup. Ini memiliki keuntungan yang membuatnya mudah untuk menyiratkan kendala yang lebih canggih pada input. Misalnya, berikut ini membagi string menjadi dua bagian, dan memastikan bahwa keduanya hanya terdiri dari digit:
Karena pola diperbaiki dalam contoh ini, ia dapat dikompilasi terlebih dahulu dan disimpan sebagai anggota statis (diinisialisasi pada waktu buka kelas dalam contoh). Ekspresi reguler adalah:
Tanda kurung menunjukkan kelompok penangkap; string yang cocok dengan bagian regexp dapat diakses dengan metode Match.group (), seperti yang ditunjukkan. The \ d cocok dengan digit desimal tunggal, dan tanda + berarti "cocok dengan satu atau lebih dari ekspresi sebelumnya). The - tidak memiliki arti khusus, jadi cocokkan karakter tersebut di input. Perhatikan bahwa Anda perlu melarikan diri dua kali garis miring terbalik saat menulis ini sebagai string Java. Beberapa contoh lain:
sumber
m.group(1)
, bagian keduam.group(2)
, karenam.group(0)
sebenarnya mengembalikan pola pencocokan penuh. Saya pikir saya juga ingatgroup(0)
dulu cocok pertama bukan pola penuh, mungkin ini berubah dalam pembaruan versi java baru-baru ini.Ini akan membagi string Anda menjadi 2 bagian. Elemen pertama dalam array akan menjadi bagian yang berisi hal-hal sebelum
-
, dan elemen ke-2 dalam array akan berisi bagian dari string Anda setelah-
.Jika panjang array tidak 2, maka string tidak dalam format:
string-string
.Lihat
split()
metode diString
kelas.sumber
harus melakukan hal yang Anda inginkan. Kelas string memiliki banyak metode untuk beroperasi dengan string.
sumber
sumber
StringTokenizer
adalah kelas lawas yang dipertahankan karena alasan kompatibilitas meskipun penggunaannya tidak disarankan dalam kode baru . Dianjurkan agar siapa pun yang mencari fungsi ini menggunakansplit
metodeString
ataujava.util.regex
paket sebagai gantinya."Dengan Java 8:
sumber
.map(String::trim)
setelahsplit
Persyaratan meninggalkan ruang untuk interpretasi. Saya sarankan menulis metode,
yang merangkum fungsi ini. Tentu saja Anda dapat menggunakan String.split (..) seperti yang disebutkan dalam jawaban lain untuk implementasi.
Anda harus menulis beberapa unit-test untuk string input dan hasil serta perilaku yang diinginkan.
Kandidat ujian yang baik harus mencakup:
Dengan menentukan hasil tes yang sesuai, Anda dapat menentukan perilaku.
Misalnya, apakah
"-333"
harus kembali[,333]
atau jika itu adalah kesalahan. Dapat"333-333-33"
dipisahkan[333,333-33] or [333-333,33]
atau itu kesalahan? Dan seterusnya.sumber
Anda dapat mencoba seperti ini juga
sumber
Berasumsi bahwa
Cara termudah adalah dengan menggunakan StringUtils # split (java.lang.String, char) . Itu lebih nyaman daripada yang disediakan oleh Java di luar kotak jika Anda tidak memerlukan ekspresi reguler. Seperti yang dikatakan dalam manualnya, ini berfungsi seperti ini:
Saya akan merekomendasikan menggunakan commong-lang, karena biasanya berisi banyak hal yang dapat digunakan. Namun, jika Anda tidak membutuhkannya selain melakukan split, maka menerapkan diri sendiri atau melarikan diri dari regex adalah pilihan yang lebih baik.
sumber
Gunakan metode split org.apache.commons.lang.StringUtils yang dapat membagi string berdasarkan karakter atau string yang ingin Anda bagi.
Metode tanda tangan:
Dalam kasus Anda, Anda ingin membagi string ketika ada "-".
Anda dapat melakukannya sebagai berikut:
Keluaran:
Asumsikan bahwa jika
-
tidak ada dalam string Anda, itu mengembalikan string yang diberikan, dan Anda tidak akan mendapatkan pengecualian.sumber
Untuk meringkas: setidaknya ada lima cara untuk membagi string di Jawa:
String.split ():
Pattern.compile (regexp) .splitAsStream (input):
StringTokenizer (kelas lawas):
Google Guava Splitter:
Apache Commons StringUtils:
Jadi, Anda dapat memilih opsi terbaik untuk Anda tergantung pada apa yang Anda butuhkan, misalnya tipe pengembalian (array, daftar, atau dapat diubah).
Berikut ini adalah ikhtisar besar dari metode ini dan contoh paling umum (bagaimana membaginya dengan titik, garis miring, tanda tanya, dll.)
sumber
Cara tercepat, yang juga mengkonsumsi sumber daya paling sedikit adalah:
sumber
string1 = s.substring(0, s.indexOf("-"));
string2 = s.substring(s.indexOf("-") + 1);
itu. Anda akan mendapatkanStringIndexOutOfBoundsException
secara otomatis jika tidak ada "-".String Split dengan beberapa karakter menggunakan Regex
Keluaran:
Tetapi jangan mengharapkan output yang sama di semua versi JDK. Saya telah melihat satu bug yang ada di beberapa versi JDK di mana string nol pertama telah diabaikan. Bug ini tidak ada dalam versi JDK terbaru, tetapi ada di beberapa versi antara JDK 1.7 versi terakhir dan 1.8 versi awal.
sumber
Untuk kasus penggunaan sederhana
String.split()
harus melakukan pekerjaan. Jika Anda menggunakan jambu biji, ada juga kelas Splitter yang memungkinkan rantai operasi string yang berbeda dan mendukung CharMatcher :sumber
sumber
Anda dapat membagi string dengan satu baris dengan menggunakan pernyataan berikut:
Anda dapat membagi string dengan tanda hubung / karakter dengan menggunakan pernyataan berikut:
sumber
sumber
Anda dapat menggunakan Split ():
Selain itu, Anda dapat menggunakan StringTokenizer:
sumber
Hanya ada dua metode yang benar-benar perlu Anda pertimbangkan.
Gunakan String.split untuk pembatas satu karakter atau Anda tidak peduli dengan kinerja
Jika kinerja bukan masalah, atau jika pembatas adalah karakter tunggal yang bukan karakter khusus ekspresi reguler (yaitu, bukan salah satu dari
.$|()[{^?*+\
) maka Anda dapat menggunakanString.split
.Metode split memiliki optimisasi untuk menghindari penggunaan ekspresi reguler jika delimeter adalah karakter tunggal dan tidak ada dalam daftar di atas. Kalau tidak, ia harus menyusun ekspresi reguler, dan ini tidak ideal.
Gunakan Pattern.split dan prakompilasi pola jika menggunakan pembatas yang kompleks dan Anda peduli dengan kinerja.
Jika kinerja adalah masalah, dan pembatas Anda bukan salah satu dari yang di atas, Anda harus melakukan pra-kompilasi pola ekspresi reguler yang kemudian dapat Anda gunakan kembali.
Opsi terakhir ini masih membuat
Matcher
objek baru . Anda juga dapat men-cache objek ini dan mengatur ulangnya untuk setiap input untuk kinerja maksimum, tetapi itu agak lebih rumit dan tidak aman.sumber
Salah satu cara untuk melakukan ini adalah dengan menjalankan melalui String dalam untuk setiap loop dan menggunakan karakter split yang diperlukan.
Keluaran:
sumber
Tolong jangan gunakan kelas StringTokenizer karena ini adalah kelas warisan yang dipertahankan karena alasan kompatibilitas, dan penggunaannya tidak disarankan dalam kode baru. Dan kita dapat menggunakan metode split seperti yang disarankan oleh orang lain juga.
Dan seperti yang diharapkan akan dicetak:
Dalam jawaban ini saya juga ingin menunjukkan satu perubahan yang telah terjadi untuk
split
metode di Java 8 . Metode String # split () memanfaatkanPattern.split
, dan sekarang itu akan menghapus string kosong di awal array hasil. Perhatikan perubahan dokumentasi ini untuk Java 8:Artinya untuk contoh berikut:
kita akan mendapatkan tiga string:
[0, 0, 4]
dan bukan empat seperti yang terjadi di Jawa 7 dan sebelumnya. Periksa juga pertanyaan serupa ini .sumber
Berikut adalah dua cara dua mencapainya.
CARA 1: Karena Anda harus membagi dua angka dengan karakter khusus, Anda dapat menggunakan regex
CARA 2: Menggunakan metode string split
sumber
Anda bisa menggunakan StringTokenizer untuk membagi string menjadi dua atau lebih bagian apakah ada jenis pembatas:
sumber
Lihat
split()
metode diString
kelas di javadoc.Di sini banyak contoh untuk string split tetapi saya sedikit kode dioptimalkan.
sumber
-
dengan|
dan lihat apa yang terjadi :)sumber
Saya hanya ingin menulis algoritma alih-alih menggunakan fungsi bawaan Java:
sumber
Anda dapat menggunakan metode ini
split
:sumber
Untuk membagi string, gunakan String.split (regex). Tinjau contoh berikut:
Keluaran
catatan:
Split ini (regex) mengambil regex sebagai argumen. Ingatlah untuk melarikan diri dari regex karakter khusus, seperti titik / titik.
sumber
sumber
Untuk membagi string, gunakan
String.split(regex)
:Keluaran:
sumber