En utilisant Java 8, vous pouvez faire:
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 vous n'avez pas de nombres négatifs, vous pouvez vous débarrasser de replaceAll(et utiliser !s.isEmpty()dans filter), car c'est seulement pour diviser correctement quelque chose comme 2-34(cela peut également être géré uniquement avec regex in split, mais c'est assez compliqué).
Arrays.streamtransforme notre String[]en un Stream<String>.
filter se débarrasse des chaînes vides de début et de fin ainsi que de tout - qui ne font pas partie d'un nombre.
mapToInt(Integer::parseInt).toArray()appelle parseIntchacun Stringà nous donner un int[].
Alternativement, Java 9 a une méthode Matcher.results , qui devrait permettre quelque chose comme:
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]
Dans l'état actuel des choses, ni l'un ni l'autre ne représente une grande amélioration par rapport à la simple lecture en boucle des résultats avec Pattern/ Matchercomme indiqué dans les autres réponses, mais cela devrait être plus simple si vous souhaitez suivre cela avec des opérations plus complexes qui sont considérablement simplifiées avec l'utilisation de ruisseaux.