Utilizzando Java 8, puoi fare:
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 non hai numeri negativi, puoi sbarazzarti di replaceAll
(e usare !s.isEmpty()
in filter
), poiché è solo per dividere correttamente qualcosa di simile 2-34
(questo può anche essere gestito esclusivamente con regex in split
, ma è abbastanza complicato).
Arrays.stream
trasforma il nostro String[]
in un file Stream<String>
.
filter
elimina le stringhe vuote iniziali e finali e quelle -
che non fanno parte di un numero.
mapToInt(Integer::parseInt).toArray()
chiede parseInt
a ciascuno String
di darci un int[]
.
In alternativa, Java 9 ha un metodo Matcher.results , che dovrebbe consentire qualcosa come:
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]
Allo stato attuale, nessuno di questi è un grande miglioramento rispetto al semplice ciclo dei risultati con Pattern
/ Matcher
come mostrato nelle altre risposte, ma dovrebbe essere più semplice se vuoi seguirlo con operazioni più complesse che sono notevolmente semplificate con l'uso di flussi.