Bagaimana dan mengapa? Apakah ini regex yang berarti karakter apa pun? Karena menurut saya, dengan cara kerja split, ini seharusnya hanya di split pada karakter sebenarnya (,?,!, ^, Dan). Namun, ini berfungsi seperti yang Anda katakan.
@ EW-CodeMonkey (?!... )adalah sintaks regex untuk pernyataan negatif - ini menegaskan bahwa tidak ada kecocokan dari apa yang ada di dalamnya. Dan ^mencocokkan awal string, sehingga ekspresi reguler cocok di setiap posisi yang bukan awal string, dan menyisipkan pemisahan di sana. Regex ini juga cocok di akhir string dan juga akan menambahkan string kosong ke hasil, kecuali bahwa String.splitdokumentasinya mengatakan "string kosong di belakang tidak disertakan dalam larik yang dihasilkan".
Boann
8
Di Java 8, perilaku String.splitsedikit diubah sehingga string kosong utama yang dihasilkan oleh pencocokan lebar-nol juga tidak disertakan dalam larik hasil, sehingga (?!^)pernyataan bahwa posisi bukan awal string menjadi tidak diperlukan, memungkinkan regex untuk disederhanakan menjadi tidak ada - "cat".split("")- tetapi di Java 7 dan di bawahnya yang menghasilkan string kosong utama dalam larik hasil.
Boann
1
Ini menciptakan array dari seluruh string.
Eduard
109
"cat".toCharArray()
Tetapi jika Anda membutuhkan string
"cat".split("")
Edit: yang akan mengembalikan nilai pertama yang kosong.
Ini adalah perubahan yang mengerikan di jdk8 karena saya mengandalkan split ("") dan melakukan penyelesaian yang menyebabkan indeks pertama kosong yang konyol ini. Sekarang setelah memutakhirkan ke java8, ini berfungsi seperti yang saya harapkan bertahun-tahun yang lalu. sayangnya sekarang solusi saya memecahkan kode saya ... ggrrrr.
Marc
@Marc Anda mungkin harus .toCharArray()tetap menggunakan ; itu menghindari regex dan mengembalikan array charprimitif sehingga lebih cepat dan lebih ringan. Aneh jika membutuhkan larik string 1 karakter .
Nitpicking, pertanyaan asli meminta array String, bukan array Char. Namun cukup mudah untuk mendapatkan array String dari sini.
dsolimano
Ya, saya sudah tahu cara mendapatkan array karakter. Saya hanya bisa mengulang melalui array karakter dan membuat string dari masing-masing, jika tidak ada cara lain.
Matt
Bagaimana Anda akan cArraykembali ke String?
Bitmap
Sintaks yang benar adalah: char [] cArray = str.ToCharArray ();
dbz
6
Jika karakter di luar Basic Multilingual Plane diharapkan pada input (beberapa karakter CJK, emoji baru ...), pendekatan seperti "a💫b".split("(?!^)")tidak dapat digunakan, karena mereka memecah karakter tersebut (hasil menjadi array ["a", "?", "?", "b"]) dan sesuatu yang lebih aman harus digunakan:
Cara efisien untuk mengubah String menjadi larik String satu karakter adalah dengan melakukan ini:
String[] res =newString[str.length()];for(int i =0; i < str.length(); i++){
res[i]=Character.toString(str.charAt(i));}
Namun, ini tidak memperhitungkan fakta bahwa a chardalam aString sebenarnya bisa mewakili setengah dari titik kode Unicode. (Jika titik kode tidak ada di BMP.) Untuk mengatasinya, Anda perlu mengulang melalui titik kode ... yang lebih rumit.
Pendekatan ini akan lebih cepat daripada menggunakan String.split(/* clever regex*/), dan mungkin akan lebih cepat daripada menggunakan aliran Java 8+. Kemungkinan lebih cepat dari ini:
String[] res =newString[str.length()];int0=0;for(char ch: str.toCharArray[]){
res[i++]=Character.toString(ch);}
karena toCharArrayharus menyalin karakter ke array baru.
Apakah Anda yakin ini akan membagi string menjadi array? Anda baru saja mencetak string ke layar.
TDG
0
Jika string asli berisi karakter Unicode tambahan , maka split()tidak akan berfungsi, karena itu membagi karakter ini menjadi pasangan pengganti. Untuk menangani karakter khusus ini dengan benar, kode seperti ini berfungsi:
String[] chars =newString[stringToSplit.codePointCount(0, stringToSplit.length())];for(int i =0, j =0; i < stringToSplit.length(); j++){int cp = stringToSplit.codePointAt(i);char c[]=Character.toChars(cp);
chars[j]=newString(c);
i +=Character.charCount(cp);}
.split("")
akan melakukannya.Jawaban:
Ini akan menghasilkan
sumber
(?!
...)
adalah sintaks regex untuk pernyataan negatif - ini menegaskan bahwa tidak ada kecocokan dari apa yang ada di dalamnya. Dan^
mencocokkan awal string, sehingga ekspresi reguler cocok di setiap posisi yang bukan awal string, dan menyisipkan pemisahan di sana. Regex ini juga cocok di akhir string dan juga akan menambahkan string kosong ke hasil, kecuali bahwaString.split
dokumentasinya mengatakan "string kosong di belakang tidak disertakan dalam larik yang dihasilkan".String.split
sedikit diubah sehingga string kosong utama yang dihasilkan oleh pencocokan lebar-nol juga tidak disertakan dalam larik hasil, sehingga(?!^)
pernyataan bahwa posisi bukan awal string menjadi tidak diperlukan, memungkinkan regex untuk disederhanakan menjadi tidak ada -"cat".split("")
- tetapi di Java 7 dan di bawahnya yang menghasilkan string kosong utama dalam larik hasil.Tetapi jika Anda membutuhkan string
Edit: yang akan mengembalikan nilai pertama yang kosong.
sumber
.toCharArray()
tetap menggunakan ; itu menghindari regex dan mengembalikan arraychar
primitif sehingga lebih cepat dan lebih ringan. Aneh jika membutuhkan larik string 1 karakter .sumber
cArray
kembali keString
?Jika karakter di luar Basic Multilingual Plane diharapkan pada input (beberapa karakter CJK, emoji baru ...), pendekatan seperti
"a💫b".split("(?!^)")
tidak dapat digunakan, karena mereka memecah karakter tersebut (hasil menjadiarray ["a", "?", "?", "b"]
) dan sesuatu yang lebih aman harus digunakan:sumber
Cara efisien untuk mengubah String menjadi larik String satu karakter adalah dengan melakukan ini:
Namun, ini tidak memperhitungkan fakta bahwa a
char
dalam aString
sebenarnya bisa mewakili setengah dari titik kode Unicode. (Jika titik kode tidak ada di BMP.) Untuk mengatasinya, Anda perlu mengulang melalui titik kode ... yang lebih rumit.Pendekatan ini akan lebih cepat daripada menggunakan
String.split(/* clever regex*/)
, dan mungkin akan lebih cepat daripada menggunakan aliran Java 8+. Kemungkinan lebih cepat dari ini:karena
toCharArray
harus menyalin karakter ke array baru.sumber
Untuk meringkas jawaban lainnya ...
Ini berfungsi pada semua versi Java:
Ini hanya berfungsi di Java 8 dan yang lebih baru:
sumber
Mungkin Anda dapat menggunakan perulangan for yang melewati konten String dan mengekstrak karakter dengan karakter menggunakan
charAt
metode ini.Dikombinasikan dengan
ArrayList<String>
contoh, Anda bisa mendapatkan larik karakter individual.sumber
sumber
Jika string asli berisi karakter Unicode tambahan , maka
split()
tidak akan berfungsi, karena itu membagi karakter ini menjadi pasangan pengganti. Untuk menangani karakter khusus ini dengan benar, kode seperti ini berfungsi:sumber
split("(?!^)")
tidak berfungsi dengan benar jika string berisi pasangan pengganti. Anda harus menggunakansplit("(?<=.)")
.keluaran:
sumber