Używając Java 8, możesz:
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]
Jeśli nie masz liczb ujemnych, możesz pozbyć się replaceAll
(i użyć !s.isEmpty()
w filter
), ponieważ służy to tylko do prawidłowego podziału czegoś podobnego 2-34
(można to również załatwić wyłącznie za pomocą wyrażenia regularnego w split
, ale jest to dość skomplikowane).
Arrays.stream
zamienia nasz String[]
w Stream<String>
.
filter
usuwa początkowe i końcowe puste ciągi, a także te, -
które nie są częścią liczby.
mapToInt(Integer::parseInt).toArray()
apeluje parseInt
do każdego String
o przyznanie nam pliku int[]
.
Alternatywnie Java 9 ma metodę Matcher.results , która powinna pozwolić na coś takiego:
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]
W obecnym stanie żaden z nich nie jest dużym postępem w stosunku do zwykłego zapętlania wyników z Pattern
/, Matcher
jak pokazano w innych odpowiedziach, ale powinno być prostsze, jeśli chcesz kontynuować z bardziej złożonymi operacjami, które są znacznie uproszczone przy użyciu strumienie.