Usando o Java 8, você pode fazer:
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]
Se você não tiver números negativos, pode se livrar do replaceAll
(e usar !s.isEmpty()
em filter
), pois isso é apenas para dividir corretamente algo como 2-34
(isso também pode ser tratado puramente com regex em split
, mas é bastante complicado).
Arrays.stream
transforma nosso String[]
em um Stream<String>
.
filter
livra-se das strings vazias iniciais e finais, bem como de qualquer -
que não faça parte de um número.
mapToInt(Integer::parseInt).toArray()
pede parseInt
a cada um String
para nos dar um int[]
.
Como alternativa, o Java 9 tem um método Matcher.results , que deve permitir algo como:
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]
Do jeito que está, nada disso é uma grande melhoria em relação a apenas repetir os resultados com Pattern
/ Matcher
conforme mostrado nas outras respostas, mas deve ser mais simples se você quiser seguir com operações mais complexas que são significativamente simplificadas com o uso de córregos.