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.stream
transforme 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 parseInt
chacun 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
/ Matcher
comme 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.