Mit Java 8 können Sie Folgendes tun:
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]
Wenn Sie keine negativen Zahlen haben, können Sie die replaceAll(und !s.isEmpty()in filter) verwenden, da dies nur dazu dient, etwas wie richtig aufzuteilen 2-34(dies kann auch nur mit Regex in behandelt werden split, ist aber ziemlich kompliziert).
Arrays.streamverwandelt unsere String[]in eine Stream<String>.
filterentfernt die führenden und nachfolgenden leeren Zeichenfolgen sowie alle Zeichenfolgen -, die nicht Teil einer Zahl sind.
mapToInt(Integer::parseInt).toArray()fordert parseIntjeden Stringauf, uns eine zu geben int[].
Alternativ verfügt Java 9 über eine Matcher.results- Methode, die Folgendes ermöglichen sollte:
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]
So wie es aussieht, ist keines von beiden eine große Verbesserung gegenüber dem einfachen Durchlaufen der Ergebnisse mit Pattern/, Matcherwie in den anderen Antworten gezeigt, aber es sollte einfacher sein, wenn Sie dies mit komplexeren Operationen verfolgen möchten, die durch die Verwendung von erheblich vereinfacht werden Streams.