Sử dụng Java 8, bạn có thể làm:
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]
Nếu bạn không có số âm, bạn có thể loại bỏ replaceAll
(và sử dụng !s.isEmpty()
trong filter
), vì điều đó chỉ để phân chia đúng một cái gì đó như 2-34
(điều này cũng có thể được xử lý hoàn toàn bằng regex in split
, nhưng nó khá phức tạp).
Arrays.stream
biến của chúng tôi String[]
thành một Stream<String>
.
filter
loại bỏ các chuỗi trống ở đầu và cuối cũng như bất kỳ chuỗi nào -
không phải là một phần của số.
mapToInt(Integer::parseInt).toArray()
kêu gọi parseInt
mỗi người String
cung cấp cho chúng tôi một int[]
.
Ngoài ra, Java 9 có phương thức Matcher.results , phương thức này sẽ cho phép một số thứ như:
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]
Như hiện tại, cả hai đều không phải là một cải tiến lớn so với việc chỉ lặp lại các kết quả với Pattern
/ Matcher
như được hiển thị trong các câu trả lời khác, nhưng sẽ đơn giản hơn nếu bạn muốn theo dõi điều này với các hoạt động phức tạp hơn được đơn giản hóa đáng kể với việc sử dụng dòng suối.