Con Java 8, puede hacer:
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]
Si no tiene números negativos, puede deshacerse de replaceAll
(y usar !s.isEmpty()
en filter
), ya que eso es solo para dividir correctamente algo como 2-34
(esto también se puede manejar puramente con expresiones regulares split
, pero es bastante complicado).
Arrays.stream
convierte nuestro String[]
en un Stream<String>
.
filter
elimina las cadenas vacías iniciales y finales, así como las -
que no forman parte de un número.
mapToInt(Integer::parseInt).toArray()
pide parseInt
a cada uno String
que nos dé un int[]
.
Alternativamente, Java 9 tiene un método Matcher.results , que debería 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]
Tal como está, ninguno de estos es una gran mejora con respecto a simplemente recorrer los resultados con Pattern
/ Matcher
como se muestra en las otras respuestas, pero debería ser más simple si desea seguir esto con operaciones más complejas que se simplifican significativamente con el uso de arroyos.