Menggunakan Java 8, Anda dapat melakukan:
String str = "There 0 are 1 some -2-34 -numbers 567 here 890 .";
int[] ints = Arrays.stream(str.replaceAll("-", " -").split("[^-\\d]+"))
.filter(s -> !s.matches("-?"))
.mapToInt(Integer::parseInt).toArray();
System.out.println(Arrays.toString(ints)); // prints [0, 1, -2, -34, 567, 890]
Jika Anda tidak memiliki angka negatif, Anda dapat menyingkirkan replaceAll
(dan penggunaan !s.isEmpty()
di filter
), karena itu hanya untuk sesuatu yang benar perpecahan seperti 2-34
(ini juga bisa ditangani murni dengan regex di split
, tapi itu cukup rumit).
Arrays.stream
mengubah kami String[]
menjadi Stream<String>
.
filter
menghilangkan string kosong di depan dan di belakangnya serta -
yang bukan bagian dari angka.
mapToInt(Integer::parseInt).toArray()
memanggil parseInt
masing String
- masing untuk memberi kami int[]
.
Atau, Java 9 memiliki metode Matcher.results , yang memungkinkan sesuatu seperti:
Pattern p = Pattern.compile("-?\\d+");
Matcher m = p.matcher("There 0 are 1 some -2-34 -numbers 567 here 890 .");
int[] ints = m.results().map(MatchResults::group).mapToInt(Integer::parseInt).toArray();
System.out.println(Arrays.toString(ints)); // prints [0, 1, -2, -34, 567, 890]
Seperti berdiri, tidak satu pun dari ini merupakan peningkatan besar dari hanya mengulang hasil dengan Pattern
/ Matcher
seperti yang ditunjukkan pada jawaban lain, tetapi harus lebih sederhana jika Anda ingin menindaklanjutinya dengan operasi yang lebih kompleks yang secara signifikan disederhanakan dengan penggunaan aliran.