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.stream
verwandelt unsere String[]
in eine Stream<String>
.
filter
entfernt die führenden und nachfolgenden leeren Zeichenfolgen sowie alle Zeichenfolgen -
, die nicht Teil einer Zahl sind.
mapToInt(Integer::parseInt).toArray()
fordert parseInt
jeden String
auf, 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
/, Matcher
wie 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.